微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在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个节点时会发生这种情况。

解决方法

首先,

router-link

您的问题是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;

通常,这是非常类似于C的C ++。原始指针很难正确使用,特别是在涉及异常安全性时。因此,我努力不写auto node = std::make_unique<llnode<int>>(6); auto node1 = std::make_unique<llnode<int>>(2); new。 (有地方,但实际上,您想要避开它们。)

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

在C ++ 11及更高版本中,不要使用nullptr,而要使用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也会为您删除。

双链链接列表通常具有单独的类型,该类型对用户隐藏节点,从而保持对正面和背面的访问。然后,您可以提供标准操作,例如next != nullptr

,

在主目录中使用它们时,指针不会初始化。结束于未定义的行为。

执行此操作:

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

还要注意,在析构函数中调用delete this;会导致无限循环(更多信息here)。删除析构函数并手动释放空间,或者更好地使用Smart Pointers或RAII方法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?