【问题标题】:c++: array of pointer to objects -> program crash when elements are deletedc ++:指向对象的指针数组->删除元素时程序崩溃
【发布时间】: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


【解决方案1】:

你有未定义的行为。您使用new[] 分配数组。要摆脱阵列,您必须使用delete []。您不能对单个元素调用 delete,因为它们从未分配有 new。

我建议您改用std::vector。如果你需要移除向量的某个元素,你可以erase它。

【讨论】:

  • 此外,如果您必须共享元素,您可能可以使用shared_ptr,这样您就可以确保当没有指向该对象时它会被删除。
  • @apalomer 你可能可以,但你应该尽量避免它。
  • 你为什么要这样做?我不明白为什么要避免智能指针。但是,我可能对智能指针的了解不够多,所以您很可能是对的。
  • @apalomer 通常你不想避开std::shared_ptr。它比std::unique_ptr 贵很多(如果你真的需要一个指针,这应该是你的首要考虑)。但是,您甚至可能根本不需要指针,恕我直言,这是最好的选择。
猜你喜欢
  • 1970-01-01
  • 2015-12-06
  • 2014-07-16
  • 1970-01-01
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
相关资源
最近更新 更多