当从C malloc保留内存时,应如何使用c++类?
我正在使用一个C库(lua),我需要将一个C++类暴露给它,以便在这种情况下进行垃圾回收并预留空间,lua进行内存分配。
以下是一个更简单的相似场景:
#include <string>
class Clase{
private:
std::string valor;
public:
Clase(){}
Clase(const std::string & valor) : valor(valor){}
const std::string & get() const { return this->valor; }
void set(const std::string & valor){ this->valor = valor;}
~Clase(){}
};
typedef struct
{
Clase cls;
}Estructura;
int main(int argc, char ** argv)
{
Estructura * est = (Estructura *) malloc(sizeof(Estructura));
est->cls.set("Hola"); // First attempt
Clase myCls; // Second attempt
est->cls = myCls;
return 0;
}
我理解并检查了,使用malloc函数创建类实例时不会调用类构造函数;这是预期的,因此不能使用无效实例(Class中的字符串)调用复制(分配)运算符。我怀疑第二次尝试在复制Class实例中的字符串时失败了。
那么:
- 是否可以正确地初始化通过malloc函数保留内存的类实例?
- 还有哪些注意事项?虚函数表?
- 与malloc函数对应的free函数是否会导致内存泄漏?(我猜想由于类析构函数不会被调用,所以字符串不会被正确释放?[我假设字符串保存在实例本身之外的内存中])
在Estructura中使用Clase的指针可以很好地工作,这是最佳解决方案吗?
额外提问:什么是在lua垃圾回收时删除实例的最佳方法?使用__gc元方法还是有其他更好的方法?