在未初始化的无主内存中初始化std :: string

时间:2014-10-23 14:55:39

标签: c++ c++11

我使用的是一个C库(libwebsockets),它允许每个客户端使用一些用户数据。该库拥有此内存,将其作为void*传递,我的代码reinterpret_cast将其传递给我的用户数据类型。

我尝试在此类中添加std::string字段,现在看到段错误。在这个类上调用函数会导致错误,这很不公平,因为它可能由未初始化的内存支持。

如何初始化该内存>我尝试过分配(赋值运算符段错误)并调用各种函数,例如clear。我猜这里有一个C ++机制。

此外,如何在不再需要字符串时调用析构函数?

2 个答案:

答案 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();