在 C++ 上创建指针时如何删除错误?在这种情况下,我必须使用原始指针
How can I delete the Error when creating pointers on C++? I this case I have to use raw pointers
我正在尝试创建一个链接列表,其中包含一个指向名为 Node 的模板 class 的指针:
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 个节点时它就正确了。
当你在 main 中使用它们时,你的指针没有被初始化。这以未定义的行为结束。
这样做:
llnode<int> *node = new llnode<int>;
node->key = 6;
llnode<int> *node1 = new llnode<int>;
node->key = 2;
另请注意,在析构函数中调用 delete this;
会导致无限循环(更多信息 here)。删除析构函数并手动释放 space 或更好地使用智能指针或 RAII 方法。
首先,对于
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-like C++。原始指针很难正确使用,尤其是涉及到异常安全时。出于这个原因,我努力从不写 new
或 delete
。 (有些地方,但真的,你想避开它们。)
您可以使用 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
指向的节点(如果next != nullptr
)也将被删除。
通常,doubly-linked 链表会有一个单独的类型,对用户隐藏节点,保持对前端和后端的访问。然后你可以提供标准操作,例如 list<T>.push_back(const T&)
.
我正在尝试创建一个链接列表,其中包含一个指向名为 Node 的模板 class 的指针:
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 个节点时它就正确了。
当你在 main 中使用它们时,你的指针没有被初始化。这以未定义的行为结束。
这样做:
llnode<int> *node = new llnode<int>;
node->key = 6;
llnode<int> *node1 = new llnode<int>;
node->key = 2;
另请注意,在析构函数中调用 delete this;
会导致无限循环(更多信息 here)。删除析构函数并手动释放 space 或更好地使用智能指针或 RAII 方法。
首先,对于
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-like C++。原始指针很难正确使用,尤其是涉及到异常安全时。出于这个原因,我努力从不写 new
或 delete
。 (有些地方,但真的,你想避开它们。)
您可以使用 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
指向的节点(如果next != nullptr
)也将被删除。
通常,doubly-linked 链表会有一个单独的类型,对用户隐藏节点,保持对前端和后端的访问。然后你可以提供标准操作,例如 list<T>.push_back(const T&)
.