使用malloc()初始化类

当从C malloc中保留其内存时,如何使用C++类?

我正在使用一个C库(lua),我需要向其中公开一个C++类,并为垃圾回收这些保留空间,lua进行内存预留。

以下是类似的简化场景:

我理解并已经检查过,用malloc时不会调用类构造函数;这是预期的,因此无法使用无效实例(Class内的字符串)调用复制(赋值)运算符。我怀疑在同一点上第二次尝试也会失败,在Class实例内部复制字符串时。

因此:

  • 是否可以正确初始化通过malloc保留内存的类实例?
  • 还有什么其他注意事项?虚表?
  • 完全地释放malloc的内存是否会导致内存泄漏?(我猜想由于Class析构函数不会被调用,因此该字符串不会被正确释放?[我假设string在实例本身之外保存内存])
  • 在Estructura中使用Class的指针可行,这是最佳解决方案吗?
  • 当lua进行垃圾回收时,最好的方法是什么?使用__gc元方法还是有更好的方法?
点赞
用户26095
用户26095

使用malloc而不是new有点奇怪,但是可以实现。你需要使用放置new:

void *memory = malloc(sizeof(Estructura));

Estructura *est = new(memory)Estructura;

当你完成对象操作后,你需要自己调用析构函数:

est->~Estructura();

所有的东西,比如vtables,都会自动正确地初始化,所以不需要担心。最棘手的部分是处理删除,需要在通过free释放内存之前,先将对象析构。delete会自动为你执行这个动作,但你需要自己处理这个事情。

2015-05-05 07:54:08