C++ 在C+;上创建指针时,如何删除错误+;?在这种情况下,我必须使用原始指针

C++ 在C+;上创建指针时,如何删除错误+;?在这种情况下,我必须使用原始指针,c++,pointers,constructor,nodes,C++,Pointers,Constructor,Nodes,我正在尝试创建一个带有指向名为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), pre

我正在尝试创建一个带有指向名为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;
    }
};
我收到错误消息:

403 cygwin_exception::open_stackdumpfile: Dumping stack trace to "NAME OF MY EXE".exe.stackdump
如何创建更多节点而不出错?
当我创建了2个节点时会发生这种情况,但当我创建了1个节点时,它会正确地执行此操作。

当您在main中使用它们时,您的指针不会初始化。这以未定义的行为结束

这样做:

llnode*node=新的llnode;
节点->键=6;
llnode*node1=新的llnode;
节点->键=2;
还要注意的是,调用
删除此项导致无限循环(更多信息)。移除析构函数并手动释放空间,或者最好使用智能指针或RAII方法

llnode<int> *node;
node->key = 6;
llnode<int> *node1;
node->key = 2;
或者更好:

auto node = std::make_unique<llnode<int>>(6);
auto node1 = std::make_unique<llnode<int>>(2);
删除此节点时,由
next
(如果
next!=nullptr
)指向的节点也将为您删除


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

您的指针未初始化。你无法知道他们指的是什么。因此,当您尝试使用
node->key=6写入内存时任何事情都可能发生。无关:你为什么需要
删除这个在析构函数中?这不是必需的,可能会导致奇怪的行为。请避免在
->
周围添加空格。这只会降低代码的可读性。当我以这种方式初始化指针时,在创建llnode的第二个指针时,我会遇到同样的错误。您是否删除了析构函数?是的,我已从析构函数中删除了删除。@ErickMurillo,这是问题的答案。我建议你先解决一下这个新问题,如果你被卡住了,再问一个新问题。做一个决定。MRE是一种非常强大的调试技术。完成正确你留下了一个非常小的程序,它只是一个bug。在这一点上很容易看出问题所在,但你很少需要走那么远。经过几轮分而治之之后,这个bug可能隐藏的空间太小了。问题是我必须在这个项目上使用原始指针,我知道智能PTR,但在这种情况下我需要使用原始指针。问题显示未初始化的指针会导致崩溃。如果这个答案(如目前所写)是由OP修改的,那么现在它们不会去引用默认初始化的唯一指针,仍然会导致崩溃,这意味着什么呢?
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);
#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)) {}
};