我使用的是一个C库(libwebsockets),它允许每个客户端使用一些用户数据。该库拥有此内存,将其作为void*
传递,我的代码reinterpret_cast
将其传递给我的用户数据类型。
我尝试在此类中添加std::string
字段,现在看到段错误。在这个类上调用函数会导致错误,这很不公平,因为它可能由未初始化的内存支持。
如何初始化该内存>我尝试过分配(赋值运算符段错误)并调用各种函数,例如clear
。我猜这里有一个C ++机制。
此外,如何在不再需要字符串时调用析构函数?
答案 0 :(得分:2)
假设你有类似这样的类型:
class MyType
{
std::string foo;
std::string bar;
};
假设void *
指向至少sizeof(MyType)
字节的未初始化分配,那么您可以使用放置新语法构造它(以及所有包含的对象):
void init_callback(void * ptr) {
new (ptr) MyType();
}
同样,您可以通过直接调用析构函数来破坏您的类型(将破坏所有包含的对象)。
void destroy_callback(void * ptr) {
MyType * mine = reinterpret_cast<MyType *>(ptr);
mine->~MyType();
}
通常你不直接调用析构函数,但是你必须这样做,因为你不能安全地delete
指针。规则“每个new
应该有一个delete
”在这种情况下有一个模拟:“每个placement-new都应该对析构函数进行一次显式调用。”
答案 1 :(得分:1)
您可以使用placement-new在提供的内存中创建对象:
std::string * s = new(memory) std::string;
并在重用或释放内存之前调用析构函数来销毁它:
s->std::string::~string();
如果您发现有点拗口,那么using std::string;
会将其缩小为s->~string();