【问题标题】:Is there a problem with this class' constructor/destructor?这个类的构造函数/析构函数有问题吗?
【发布时间】:2020-04-06 09:55:25
【问题描述】:

我在一个更大的函数中使用这个类,它没有正确终止。

我不得不一次次将算法注释掉一大块,以缩小问题的起点。

整个事情都像写的那样工作,但最终错误地终止并终止了正在调用它的main()

无论如何,当我实例化这个类时,问题就开始了。我假设它一定是析构函数的问题,当对象超出范围时导致错误。

这是类定义以及构造函数/析构函数:

class Entry
{
    private:
        int act_count; //number of activities for generating array MUST BE DETERMINED BEFORE INSTANTIATION
        int ex_count; //number of expenditures for generating array

    public:
        Entry(int, int); // constructor
        ~Entry(); // destructor
        string date; // functions like a title
        Activity * act_arr; // pointer to an array of activities
        Expenditure * ex_arr; // pointer to an array of expenditures 
        // list of member functions
};

struct Activity
{
    public:
        string a_name;
        float time;
};

struct Expenditure
{
    public:
        string e_name;
        float price;
};

构造函数:

Entry::Entry(int a_count, int e_count)
{
    // initialization of basic members
    date = day_o_year();
    act_count = a_count;
    ex_count = e_count;

    // allocation of array space
    act_arr = new Activity[act_count];
    ex_arr = new Expenditure[ex_count];
}

析构函数:

Entry::~Entry()
{
    // prevents memory leaks when object falls out of scope and is destroyed
    delete act_arr;
    delete ex_arr;
}

这里有什么严重的错误吗?我希望这不是太多的代码来引起一些兴趣。

提前致谢。

【问题讨论】:

  • 这能回答你的问题吗? What is The Rule of Three?
  • 我正在阅读此内容,感谢您的链接。这不在推荐帖子列表中
  • 如果您使用智能指针而不是原始指针,您还应该阅读:stackoverflow.com/questions/44997955/rule-of-zero-confusion 以及它包含的链接。
  • @Richard Critten 为今晚阅读添加了书签。非常感谢。
  • 使用std::vector 代替智能指针,比原来的手动分配要好得多。通过使用适当的容器,您可以避免大量代码和许多潜在问题,例如内存泄漏、原始代码可能发生的双重删除。

标签: c++ class constructor destructor


【解决方案1】:

对于初学者,我认为您需要这个(delete[] 数组):

Entry::~Entry() {
    // prevents memory leaks when object falls out of scope and is destroyed
    delete[] act_arr;
    delete[] ex_arr;
}

但除此之外,“没有正确终止”到底是什么意思?

问:您有堆栈跟踪/核心转储吗?

问:您是否使用调试器单步执行代码?

问:您有可以复制/粘贴到帖子中的特定错误消息吗?

【讨论】:

  • 我的意思是,Entry 和调用它的函数按我的意图工作。它生成数组,将数据放入数组,将数组的内容写入文件等。但是当函数终止时,它会崩溃它所属的main()
  • 1) 我需要查看这些概念是什么 2) 我不知道如何使用调试器 3) 唯一的错误消息是“(退出代码 -1)”。我使用 Eclipse。找不到各种退出代码含义的目录。
  • 我会尽力了解您提到的概念,并查找有关如何正确使用delete 的说明。非常感谢
  • @MagicGAT 1. 如果我理解正确,您的函数不是main() 的一部分,它只是从main() 调用的。 2. 当函数正常工作并在返回时崩溃时,可能的原因是堆栈被覆盖。调查函数中可能存在的缓冲区溢出。
  • 很高兴它成功了!这是关于 Eclipse CDT 调试器的简短教程(听起来这可能就是您正在使用的):help.eclipse.org/2019-09/…。我猜你已经注意到delete[] 上的链接:en.cppreference.com/w/cpp/memory/new/operator_delete
猜你喜欢
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 2016-02-20
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多