如何解决在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;
}
};
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 举报,一经查实,本站将立刻删除。