如何在c++中停止在循环中创建对象

How to stop a object being created in a loop from begin destroyed in c++?

本文关键字:循环 创建对象 c++      更新时间:2023-10-16

我已经定义了一个结构体:

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"处出现错误。

对象被销毁,因为它们是循环的局部对象(在堆栈上创建)。相反,您必须使用关键字new才能在堆上创建它。试着这样做
something & aSomething = *new something;
SimpleClass * anObject = new SimpleClass(i);
aSomething.object = anObject;
array[i] = aSomething;

把这个放到for循环中而不是原来的
另外,我建议使用new而不是malloc来创建数组,因为您正在使用c++

你必须小心变量的作用域,因为你依赖于堆栈。

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

也会在循环结束时被删除

1)使用new操作符创建对象而不是malloc

something* array = new something[2];

2)因为你在for循环结束后创建局部对象,局部对象"anObject"被销毁。所以你在for循环外看到了错误而是创建一个动态对象来存储。

 something*aSomething = new something();
 SimpleClass* anObject = new SimpleClass(i);
    aSomething->object = anObject;
    array[i] = aSomething;

使用关键字'new'创建数组及其元素。Malloc是C语言的东西,在c++中已经过时了。