如何正確洗掉雙指標陣列?當我嘗試這段代碼時,memcheck 告訴我“使用大小 8 的未初始化值”和“大小 4 的無效寫入”。我想不通我哪里做錯了。
struct Node
{
int value;
Node* next;
};
int main()
{
Node** doublePtrNode= new Node* [10];
for (unsigned int i = 0; i < 10; i )
{
doublePtrNode[i]->value=i;
}
for (unsigned int i = 0; i < 10; i )
{
delete doublePtrNode[i];
}
delete[] doublePtrNode;
return 0;
}
uj5u.com熱心網友回復:
你已經在釋放你已經分配的東西,但doublePtrNode[i]->value=i;假設你已經在Node那里分配了一個,但你還沒有,所以程式有未定義的行為。
如果您打算使用原始擁有指標,您可以像這樣修復它:
Node** doublePtrNode = new Node*[10];
// now allocate the actual `Node`s too:
for(unsigned i = 0; i < 10; i) doublePtrNode[i] = new Node;
// your current assigning loop goes here
// deallocate the `Node`s:
for(unsigned i = 0; i < 10; i) delete doublePtrNode[i];
delete[] doublePtrNode;
一個更簡單、更安全的選擇是使用std::vector<Node>. 這樣您就不需要任何手動記憶體管理。它為你做。
#include <vector>
int main() {
std::vector<Node> nodes(10);
// your current assigning loop goes here
} // all `Node`s are deleted when `nodes` goes out of scope
uj5u.com熱心網友回復:
您需要在為其分配值之前創建每個節點 doublePtrNode[i]
struct Node
{
int value;
Node* next;
};
int main()
{
Node** doublePtrNode = new Node * [10];
for (int i = 0; i < 10; i )
{
doublePtrNode[i] = new Node{ i,nullptr };
}
for (unsigned int i = 0; i < 10; i )
{
delete doublePtrNode[i];
}
delete[] doublePtrNode;
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/360365.html
上一篇:如何正確分配指向回呼函式的指標?
下一篇:指標改變它指向的地址的值
