2

我定义了一个结构:

struct something {
    SimpleClass *object;
};

我想创建一个声明的这些结构的数组

something* array = (something*)malloc(sizeof(something) * 2);

然后我循环创建结构,用对象填充它,并将其添加到数组中:

for (int i = 0; i < 2; i++) {
    something aSomething;
    SimpleClass anObject = SimpleClass(i);
    aSomething.object = &anObject;
    array[i] = aSomething;
    // Point 1
}
// Point 2

在某些时候,对象会被销毁,因为如果我调用此行(例如):

array[0].object->doSomething();

它在“第 1 点”运行良好,但在“第 2 点”出现错误。

提前致谢。

4

4 回答 4

3

对象正在被销毁,因为它们是循环的本地(在堆栈上创建)。相反,您必须使用关键字 new 才能在堆上创建它。尝试这样做 把它放在 for 循环中而不是你所拥有的 另外我建议使用 new 而不是 malloc 来创建你的数组,因为你使用的是 c++
something & aSomething = *new something;
SimpleClass * anObject = new SimpleClass(i);
aSomething.object = anObject;
array[i] = aSomething;


于 2013-06-07T18:03:22.583 回答
2

由于您依赖于堆栈,因此您必须小心变量的范围。

SimpleClass anObject = SimpleClass(i);

这将在循环结束时被销毁。为了保持持久性,您应该为它分配新的内存new

SimpleClass* anObject = new SimpleClass(i);
aSomething.object = anObject;
array[i] = aSomething;

这应该可以解决您的问题。您还必须确保稍后将其删除,否则会导致内存泄漏。

for(int i = 0; i < sizeOfArray; i++)
{
    delete array[i].object;
}

请注意,在您的示例中

something aSomething

也会在循环结束时被删除

于 2013-06-07T18:04:57.020 回答
1

1) 使用 new 运算符而不是 malloc 创建对象

something* array = new something[2];

2)由于您在 for 循环结束后在 for 循环内创建本地对象,因此本地对象“anObject”正在被破坏。所以你在 for 循环之外看到错误 而是创建一个动态对象来存储。

 something*aSomething = new something();
 SimpleClass* anObject = new SimpleClass(i);
    aSomething->object = anObject;
    array[i] = aSomething;
于 2013-06-07T18:05:38.033 回答
-1

使用关键字“new”来创建数组及其元素。Malloc 是 C 的东西,在 C++ 中已过时。

于 2013-06-07T18:05:11.693 回答