我有一個名為Myclass. 在 main 函式中,我為這個類創建了一個陣列物件。每當我嘗試洗掉這個動態分配的陣列時,visual studio 都會說,Error: Debug Assertion Failed!. Expression: is_block_type_valid(header->_block_use). 你能告訴我是什么導致了這個問題,或者告訴我一個解決這個問題的例子。
#include <iostream>
using namespace std;
class Myclass
{
public:
void print()
{
cout << "Hello from Myclass" << endl;
}
};
int main()
{
Myclass *obj[3] = { new Myclass, new Myclass, new Myclass };
// Call each object's print function.
for (int index=0; index < 3; index )
{
obj[index]->print();
}
delete[] obj; //Error
return 0;
}
uj5u.com熱心網友回復:
這個:
Myclass *obj[3] = { new Myclass, new Myclass, new Myclass };
不是動態分配的陣列。它是一個具有自動存盤功能的陣列,包含指向動態分配物件的指標。要正確清理,您需要:
delete obj[0];
delete obj[1];
delete obj[2];
因為 eachnew必須與 a 匹配delete,并且您只能通過delete[]通過new[].
這里不需要任何動態分配,只需:
Myclass obj[3] = {};
uj5u.com熱心網友回復:
該delete[]運營商應該只用于使用創建的陣列new[]運算子,你obj是不是。您有一個固定的指向物件的指標陣列,每個物件都必須像這樣洗掉:
for (int index=0; index < 3; index )
{
delete obj[index];
}
或者,您可以使用new[]運算子創建物件陣列,然后使用以下命令洗掉陣列delete[]:
int main()
{
Myclass* obj = new Myclass[3];
// Call each object's print function.
for (int index = 0; index < 3; index ) {
obj[index].print(); // Note: Use "." here, not "->"
}
delete[] obj;
return 0;
}
uj5u.com熱心網友回復:
該變數obj被宣告為元素型別為具有自動存盤持續時間的陣列Myclass *。
Myclass *obj[3] = { new Myclass, new Myclass, new Myclass };
也就是說它是一個指標陣列而不是一個指標。
陣列的每個元素實際上都是一個指向動態分配記憶體的指標。因此,由于陣列包含三個元素,您需要delete為每個元素呼叫運算子三次。
在基于范圍的 for 回圈中這樣做更簡單。
例如
for ( auto &item : obj )
{
delete item;
item = nullptr;
}
uj5u.com熱心網友回復:
我認為您分配的陣列錯誤。你應該寫Myclass* obj = new Myclass[3];
uj5u.com熱心網友回復:
上面的答案是完美的。如果您“在 C 中思考”,我只會補充說這不是一個好的樣式代碼。這是一個相當C風格的代碼。首先,當您使用 C 編碼并且沒有義務使用與 C 兼容的代碼時,每當您看到自己使用 C 指標時都要小心。在這種情況下,如果不是使用 C 指標的 C 陣列,而是使用 MyClass 物件的 std::vector,向量解構式將為每個元素呼叫類解構式,我認為這正是您想要的。我的建議:將 C 陣列更改為 std::vector,您會更快樂。看看你是如何實作它的,使用 C 11 特性并忘記舊的 C 東西:
#include <iostream>
using namespace std;
#include <vector>
class Myclass
{
public:
void print()
{
cout << "Hello from Myclass" << endl;
}
};
int main()
{
cout<<"Hello World" << endl;
vector<Myclass> obj(3);
// Call each object's print function.
for (auto instance : obj)
{
instance.print();
}
return 0;
}
在這種情況下,您甚至不必擔心洗掉物件,因為當函式超出范圍時會呼叫向量解構式,并且它會負責呼叫 Myobjects 的解構式。更干凈、更安全的代碼。
或者,如果性能對您來說是一個非常瓶頸并且您需要一個靜態陣列,如果您使用的是 C 11 或更高版本,您也可以使用 std::array,一個不那么“狂野”的選項(https://en .cppreference.com/w/cpp/container/array)。
所以這就是我留給你的提示,如果用 C 編碼,使用這種語言所能提供的最好的,并盡量忘記危險和瘋狂的舊 C 特性。當您需要時,C 作為一種輕量級和簡單的語言是很好的。但是每個人都知道它很危險(而您只是偶然發現了它)。Bjarne 的這本書側重于從頭開始教授 C ,留下了并不總是富有成效的 C 遺產: 編程:使用 C 的原則和實踐
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/325437.html
標籤:C
