C ++:析构函数不被称为[closed]

问题描述 投票:0回答:2

在下面的代码中,将调用所有构造函数,并且结果符合预期,但是在“ 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;
}
c++ function constructor destructor new-operator
2个回答
3
投票

The output I get says "Segmentation fault",即它崩溃。

显然,此崩溃发生在析构函数有机会运行之前。

这可能是因为您循环到并且包括 26,这是第27个元素。但是您的数组只有26个元素。因此,您破坏了您的记忆。

[您可能打算写for(int i = 0; i < 26; i++),而不是<=


1
投票

似乎您有一个<=,但您从0开始。将其更改为

编辑:要更快地捕获分段违规,请使用gdb之类的调试器。用-g标志进行编译,然后在控制台中键入

gdb program
run

这将执行程序直到分段错误。然后,您需要回溯。

bt

这将显示一个堆栈框架。选择发生错误的帧。

f #number

然后它将在引发错误的那一行显示本地信息。现在,您可以通过点击p和变量名称来打印本地打印信息。

p i

这将向您显示迭代器i大于容器的最大索引。

© www.soinside.com 2019 - 2024. All rights reserved.