【问题标题】:C++ : destructors not being called [closed]C ++:不调用析构函数[关闭]
【发布时间】:2020-06-20 18:49:27
【问题描述】:

在下面的代码中,所有的构造函数都被调用并且结果如预期的那样,但是在“for”循环完成后没有调用析构函数。谁能说说原因?

#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;
}

【问题讨论】:

  • 当您在for 循环中看到&lt;= 时,如for(int i = 0; i &lt;= 26; i++),请仔细检查。这通常是一个错误。

标签: c++ function constructor destructor new-operator


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    看起来您有一个

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

    gdb program
    run
    

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

    bt
    

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

    f #number
    

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

    p i
    

    这会告诉你迭代器 i 大于容器的最大索引。

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 2022-11-20
      • 1970-01-01
      • 2019-01-09
      • 2023-03-31
      • 2014-05-02
      • 2018-12-09
      • 2011-04-04
      • 2014-05-03
      相关资源
      最近更新 更多