簡體   English   中英

在 C++ 上創建指針時如何刪除錯誤? 在這種情況下,我必須使用原始指針

[英]How can I delete the Error when creating pointers on C++? I this case I have to use raw pointers

我正在嘗試使用指向名為 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 個節點時,它就正確了。

首先,對於

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指向的節點(如果next != nullptr )也會為你刪除。

通常一個雙向鏈表會有一個單獨的類型,它對用戶隱藏節點,保持對前端和后端的訪問。 然后您可以提供標准操作,例如list<T>.push_back(const T&)

當您在 main 中使用它們時,您的指針不會被初始化。 這以未定義的行為結束。

做這個:

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

還要注意調用delete this; 在析構函數中導致無限循環(更多信息在這里)。 手動移除析構函數並釋放空間,或者更好地使用智能指針或 RAII 方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM