【发布时间】:2018-02-22 04:20:13
【问题描述】:
我有一个指向“SS_Datan”类对象的指针数组。类“SS_Datan”有一个静态实例计数器“NumberInstances”,当调用类的构造函数时该计数器上升,调用析构函数时下降。我用 Number = 20 运行测试。
SS_Daten* SSDaten = new SS_Daten[Number];
SS_Daten* ptrSSDaten[Number];
for (int i = 0; i < Number; i++) {
ptrSSDaten[i] = &SSDaten[i];
}
我可以毫无问题地删除所有数组元素。正如预期的那样,计数器从 20 变为 0。
cout << endl << "Number of Instances before: " << SS_Daten::NumberInstances << endl;
delete [] *ptrSSDaten;
cout << endl << "Number of Instances after: " << SS_Daten::NumberInstances << endl;
当我一个一个删除一些(如 5 个或 6 个)数组元素时,它可以正常工作,但是当我删除所有元素时,程序会崩溃。如果我在 10 到 15 之间删除,它有时会起作用,有时会崩溃。
cout << endl << "Number of Instances before: " << SS_Daten::NumberInstances << endl;
delete ptrSSDaten[0];
delete ptrSSDaten[1];
delete ptrSSDaten[2];
delete ptrSSDaten[3];
delete ptrSSDaten[4];
delete ptrSSDaten[5];
.....
delete ptrSSDaten[19];
cout << endl << "Number of Instances after: " << SS_Daten::NumberInstances << endl;
指向对象的指针数组被传递给有时会删除元素并更改元素在数组中的位置的函数。 我需要的是一种在主实例末尾清理其余元素的方法,就像这样。但这会使程序崩溃。
cout << endl << "Number of Instances before: " << SS_Daten::NumberInstances << endl;
int AA = SS_Daten::NumberInstances;
for (int i = 0; i < AA; i++) {
delete ptrSSDaten[i];
}
cout << endl << "Number of Instances after: " << SS_Daten::NumberInstances << endl;
【问题讨论】:
-
请提供minimal reproducible example。您只显示伪代码。例如,无法知道您是否忘记为
ptrSSDaten分配合适的值,或者它只是隐藏在您未显示的代码中。 -
您的代码中有一个重大错误,您没有使用
std::vector。 -
SS_Daten* ptrSSDaten[Number];是一个尚未初始化的指针数组。在你的循环中,你正在使用它。这是一个 UB。 -
@Raindrop7 OP 循环分配给它,这不是 UB。
-
@RickAstley:谢谢!我真的没有注意到
标签: c++ arrays pointers object