包含std :: vector的结构上的Malloc

Sim*_*Sim 2 c++ malloc constructor memory-management vector

情况如下:

我使用malloc为结构分配内存.该结构包含各种项目,如指针,字符串变量和向量.

事实是,当我们使用malloc时,不会调用任何构造函数.使用类似于下面的代码,我遇到了一些情况,其中一些变量起作用,而其他变量没有.

注意:以下代码无法编译.它的目的只是为了说明这种情况.

struct MyStruct 
{
    MyClass*    mFirstClass;
    bool        mBool;
    std::string mString;
    std::vector<MyClass> mVector;
};


int main()  
{  

    MyStruct* wMyStructure;  
    wMyStructure = (MyStruct*) malloc (sizeof(MyStruct));  

    MyClass wMyClassObject;

    wMyStructure->mFirstClass = new MyClass();  
    wMyStructure->mFirstClass->func();  
    wMyStructure->mBool = false;  
    wMyStructure->mString = "aString";  
    wMyStructure->mVector.push_back(wMyClassObject);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

通过使用指针而不是那些变量(std::string* mString),然后调用对象构造函数(mString = new std::string;)不会抛出异常.

但是,我遇到过一种情况,即在没有调用构造函数的情况下使用mString没有问题,但是当它来到向量时,应用程序会自动退出.

这给我留下了很多问题:

  1. 如果没有使用构造函数,对象何时会抛出异常?

  2. 在我遇到的情况下,只有向量引起了问题.mString可以保持原样,还是应该调用它的构造函数?

  3. 使用malloc做最重要的事情最安全的方法是什么?

Vla*_*lad 5

使用对象而不构造它必须是未定义的行为.任何事情都可能随时发生.如果这样做,您不能依赖代码的任何部分来顺利运行,因为在这种情况下语言不保证任何内容.

  • 同意.即使它*看起来像它正在工作,也可能发生不好的事情. (2认同)

Ker*_* SB 3

您的代码会导致未定义的行为,因为您wMyStructure没有指向对象,因此您不能->对其使用访问器运算符。

对象只有在其构造函数完成后才开始其生命。由于您没有调用任何构造函数,因此您没有对象。

(如果您的结构是 POD,即仅由原始类型和 POD 组成,那么这就没问题,因为 POD 具有简单的构造函数,它们不执行任何操作。)

您面临的具体问题是结构的字符串和向量成员无法调用它们的构造函数,因此这些成员不存在,因此整个对象也不存在。

如果要将内存管理与对象构造分离,可以使用放置语法:

// get some memory
char arena[HUGE_VAL];
void * morespace = malloc(HUGE_VAL);

// construct some objects
MyClass   * px = new (arena + 2000) MyClass;  // default constructor
YourClass * py = new (morespace + 5000) YourClass(1, -.5, 'x');  // non-default constructor
Run Code Online (Sandbox Code Playgroud)

px->~MyClass();(当你处理完这些对象后,你必须手动销毁它们。)