首页 > 解决方案 > 在 C++ 上创建指针时如何删除错误?在这种情况下,我必须使用原始指针

问题描述

我正在尝试使用指向名为 Node 的模板类的指针创建一个链表:

template <typename T>
class llnode

{
public:
    T key;
    llnode<T> *prev, *next;

    llnode()
    {

    };

    llnode(const T &k, llnode<T> *w = NULL, llnode<T> *y = NULL) : key(k), prev(w), next(y){};

    ~llnode()
    {
        delete this;
    }
};

main但是,当我运行程序时,函数中的这段代码

llnode<int> *node;
node->key = 6;
llnode<int> *node1;
node->key = 2;

我收到错误消息:

403 cygwin_exception::open_stackdumpfile: Dumping stack trace to "NAME OF MY EXE".exe.stackdump

如何创建更多节点而不会出现错误?当我创建了 2 个节点时会发生这种情况,但是当我创建 1 个节点时它会正确。

标签: c++pointersconstructornodes

解决方案


首先,对于

llnode<int> *node;
node->key = 6;
llnode<int> *node1;
node->key = 2;

你的问题是这node是一个未初始化的指针。您应该始终初始化您的指针(或者更好的是,使用类似的智能指针unique_ptr)。尝试:

std::unique_ptr<llnode<int>> node = std::make_unique<llnode<int>>();
node->key = 6;
std::unique_ptr<llnode<int>> node1 = std::make_unique<llnode<int>>();
node->key = 2;

或更好:

auto node = std::make_unique<llnode<int>>(6);
auto node1 = std::make_unique<llnode<int>>(2);

通常,这是非常类似于 C 的 C++。原始指针很难正确使用,尤其是在异常安全方面。出于这个原因,我努力不写newdelete永远不写。(有些地方,但实际上,你想避开它们。)

您可以使用std::unique_ptr为您进行清理(和初始化)。您还可以默认原始指针指向nullptr.

在 C++11 及更高版本中,不要使用NULL,使用nullptr,它更安全。

考虑这样的事情:

#include <memory>

template <typename T>
class llnode
{
public:
    T key;
    llnode<T>* prev = nullptr; // Raw pointer back
    std::unique_ptr<llnode<T>> next; // List owns it tail.

    llnode(const T &k = {}, 
           llnode<T> *w = nullptr,
           std::unique_ptr<llnode<T>> y = nullptr)
    : key(k), prev(w), next(std::move(y)) {}
};

next当这个节点被删除时, (if )所指向的节点next != nullptr也会为你删除。

双向链表通常会有一个单独的类型,对用户隐藏节点,保持对前端和后端的访问。然后您可以提供标准操作,例如list<T>.push_back(const T&).


推荐阅读