在下面的代码中,将调用所有构造函数,并且结果符合预期,但是在“ for”循环完成后将不会调用Destructor。任何人都可以说出原因吗?
#include <iostream>
using namespace std;
class Animal
{
private:
string name;
public:
Animal(){cout << "Constructor called" << endl;}
~Animal(){cout << "Destructor called" << endl;}
void set_name(string name){this-> name =name;}
void call_name (){cout << "the letter typed is : " << name <<endl;}
};
int main(){
char c_t_car = 'A';
Animal *pDog = new Animal[26];
for(int i = 0; i <= 26; i++)
{
string s_t_name (1, c_t_car);
pDog[i].set_name(s_t_name);
pDog[i].call_name();
c_t_car++;
}
delete[] pDog;
return 0;
}
The output I get says "Segmentation fault",即它崩溃。
显然,此崩溃发生在析构函数有机会运行之前。
这可能是因为您循环到并且包括 26,这是第27个元素。但是您的数组只有26个元素。因此,您破坏了您的记忆。
[您可能打算写for(int i = 0; i < 26; i++)
,而不是<=
。
似乎您有一个<=,但您从0开始。将其更改为
编辑:要更快地捕获分段违规,请使用gdb之类的调试器。用-g标志进行编译,然后在控制台中键入
gdb program
run
这将执行程序直到分段错误。然后,您需要回溯。
bt
这将显示一个堆栈框架。选择发生错误的帧。
f #number
然后它将在引发错误的那一行显示本地信息。现在,您可以通过点击p和变量名称来打印本地打印信息。
p i
这将向您显示迭代器i大于容器的最大索引。