C++析构函数问题

标签 c++ destructor

我在 C++ 中有一个奇怪的“析构函数”行为

这是我调用的代码:

_log->OnCommit();
delete _log;

问题是当我调用“delete _log;”时它崩溃是因为变量“条目”无效!!!!

你知道为什么吗?

这是我的类(class)代码:

struct TransactionLogEntry {
    DependencyObject* Object;
    bool IsAttached;
    bool IsDeleted;
    bool IsUpdated;
};

class TransactionLog
{
public:
    TransactionLog();
    ~TransactionLog();

    void OnCommit();

    map<DependencyObject*, TransactionLogEntry*> Entries;
};

void TransactionLog::OnCommit()
{
    map<DependencyObject*, TransactionLogEntry*>::iterator it;

    for(it = Entries.begin(); it != Entries.end(); it++)
    {
        TransactionLogEntry* entry = (TransactionLogEntry*)(*it).second;
        if (entry->IsDeleted)
            delete entry->Object;

        delete entry;
    }

    Entries.clear();
}

TransactionLog::~TransactionLog()
{
    map<DependencyObject*, TransactionLogEntry*>::iterator it;

    for(it = Entries.begin(); it != Entries.end(); it++)
    {
        TransactionLogEntry* entry = (TransactionLogEntry*)(*it).second;
        delete entry;
    }

    Entries.clear();
}

最佳答案

如果没有完整的代码很难看清,但是我可以注意到您违反了三巨头规则(您有一个析构函数,但没有复制构造函数或赋值运算符),这意味着自找麻烦。

我的大胆猜测是您正在复制构建日志或其他类似问题,一旦您进入 UB 模式,那么任何事情都可能发生,包括在应该没问题的地方引发错误。

关于C++析构函数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4886405/

相关文章:

destructor - destroy() 中的访问冲突

对象的 C++ vector 和对析构函数的过度调用?

c++ - 在析构函数中检测事件异常

c++ - enable_shared_from_this 可以在没有继承的情况下使用吗?

c++ - this 和 this@entry 的区别?

c++ - 我怎样才能在 constexpr 函数中有一个临时变量?

c++ - 解决到最近元音程序的距离问题

c++ - 寻找对我的线程安全、无锁队列实现的批评

c++ - 操作系统 : GLUT window never appears

c++ - 在 C++ 中,哪个析构函数被调用?