【发布时间】:2019-05-06 16:02:39
【问题描述】:
我有一个如下所示的代码 sn-p。我为我的Something 类创建了一些动态内存分配,然后将它们删除。
代码打印出我期望的错误数据,但为什么->show 不会崩溃?
在什么情况下/如何->show 会导致崩溃?
是否可以用其他对象覆盖 i、ii、iii 的相同内存位置?
我试图理解为什么在delete 释放了要写入其他内容的内存位置之后仍然有关于->show 的信息!
#include <iostream>
#include <vector>
class Something
{
public:
Something(int i) : i(i)
{
std::cout << "+" << i << std::endl;
}
~Something()
{
std::cout << "~" << i << std::endl;
}
void show()
{
std::cout << i << std::endl;
}
private:
int i;
};
int main()
{
std::vector<Something *> somethings;
Something *i = new Something(1);
Something *ii = new Something(2);
Something *iii = new Something(3);
somethings.push_back(i);
somethings.push_back(ii);
somethings.push_back(iii);
delete i;
delete ii;
delete iii;
std::vector<Something *>::iterator n;
for(n = somethings.begin(); n != somethings.end(); ++n)
{
(*n)->show(); // In what case this line would crash?
}
return 0;
}
【问题讨论】:
-
未定义的行为不一定会导致崩溃。它的行为是……嗯,未定义。
-
@PMoubed -- 我得问一下 -- 你为什么似乎试图让程序崩溃?是不是因为您使用指针编写了一些其他代码,而您对代码的可靠性没有信心,并希望“崩溃”可以帮助您找到错误?如果是这种情况,我很遗憾地说 C++ 不能这样工作。
-
当涉及未定义的行为时,通过示例/实验学习效果不佳。实验需要一致的结果来学习。未定义的行为不一致。
-
我认为您的部分问题是为什么有关
->show()的信息没有丢失。您的方法在编译时解决。将其声明为virtual将使其在运行时从对象本身解析。但是除非你真的用一些东西覆盖了这个对象,否则你甚至不能保证它会立即崩溃。
标签: c++