首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >delete操作符在什么上下文中抛出错误?

delete操作符在什么上下文中抛出错误?
EN

Stack Overflow用户
提问于 2016-02-23 07:28:30
回答 2查看 9.1K关注 0票数 6

在链接列表的实现中,删除内部类deleteNode(Node*)实例的助手函数Node通过在VS 2015中“触发本地Windows中的断点”抛出运行时错误。我正在小心地匹配我的newdelete操作符。范围/引用是否起到了我没有意识到的作用?

即使clear()中存在逻辑错误,并且deleteNode()通过了nullptr,它也不应该抛出一个错误来删除nullptr,然后将nullptr分配给自己,对吗?删除有什么问题?

代码语言:javascript
运行
复制
class LinkedList {
public:
    LinkedList() : head(nullptr) {}
    ~LinkedList() { clear(); }

    void push_front() {
        head = createNode(head);
    }

    void clear() {
        Node* current_node = head;
        while (current_node != nullptr) {
            Node* next_node = current_node->next; // buffer
            deleteNode(current_node);
            current_node = next_node;
        }
    }

private:    
    struct Node {
        Node(Node* next)
            : next(next) {}
        Node* next;
    };
    Node* head;
    Node* createNode(Node* next) {
        return new Node(next);
    }
    void deleteNode(Node*& toDelete) {
        delete toDelete; // ***VS 2015 puts breakpoint here***
        toDelete = nullptr;
    }
};

int main() {
    auto A = LinkedList();
    A.push_front();
    A.clear();
    return 0;
}

我已经删除了与错误无关的所有属性和方法。这个虚拟代码仍然抛出相同的错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-23 07:44:37

问题在您的clear()函数中。您知道,您认为由于编写deleteNode函数的方式,您的所有节点都将在clear之后成为nullptr。不幸的是,事实并非如此。您可以将您的head复制到current_node中,当head (即current_node)被删除时,它将变成nullptr,但是head仍然是非空的。稍后,析构函数尝试再次删除它。对已经释放的内存调用delete会导致未定义的行为。

若要修复,请添加

代码语言:javascript
运行
复制
 head = nullptr;

在你的明确职能的末尾

票数 5
EN

Stack Overflow用户

发布于 2016-02-23 07:43:59

delete操作符在什么上下文中抛出错误?

如果析构函数本身抛出,则可以抛出delete表达式,也可以抛出子对象的析构函数。但你应该避免抛出破坏者。

如果尝试删除不指向有效对象的指针,则delete表达式也可能具有未定义的行为。nullptr是一个例外,它可以安全地删除。不小心删除无效指针的典型原因是尝试删除同一指针值两次,或者忘记初始化内存。未定义的behviour可能导致任何情况,包括抛出错误。

删除有什么问题?

你要删除同一指针两次。您可以通过检查调试器中的值来验证这一点。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35571298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档