[英]Memory leak or memory error when trying to handle nested objects/structs & dynamic arrays. Possible Xcode/malloc issue
When I compile with Xcode and run this, I get the error, at least 100 times in a row, malloc: *** error for object 0x100180: double free
, with the debugger pointing to line C
. 奇怪的是,在我從中提煉出來的代碼中,發生了完全相同的錯誤,但調試器指向了line B
的等價物。 我試過但無法重現。
如果我刪除line A
,代碼可以工作,但我得到一個主要的 memory 泄漏,導致程序在大約 1 分鍾內崩潰。 刪除line C
可以解決問題,但不是有效的解決方案,因為a_class
沒有適當的析構函數。
#include <iostream>
#include <vector>
struct a_struct
{
int* dynamic_array;
a_struct(int length) {dynamic_array = new int [length];}
a_struct() : dynamic_array(NULL) {}
~a_struct() { if (dynamic_array != NULL) {delete [] dynamic_array;} } //Line A
};
class a_class
{
public:
a_struct* the_structs;
a_class() {Init();}
a_class(a_class const & origin) {Init();}
void Init(){
the_structs = new a_struct [10]; //Line B
for(int q=0; q<10; q++)
the_structs[q] = a_struct(7);}
~a_class() { if (the_structs != NULL) {delete [] the_structs;} } //Line C
};
int main ()
{
std::vector <a_class> the_objects;
for(int q=0; q<10; q++)
the_objects.push_back(a_class());
while(1)
for(int q=0; q <10; q++)
for(int w=0; w <10; w++)
the_objects[q].the_structs[w] = a_struct(7);
}
修復 a_struct 和 a_class 以具有正確的復制構造函數和賦值運算符。 如果還有問題就回來。
確保您的所有課程始終遵循3 規則。 我最近似乎經常鏈接到那個頁面。
問題是您正在嘗試進行自己的 memory 管理。
使用內置容器:
struct a_struct
{
std::vector<int> dynamic_array;
a_struct(int length) : dynamic_array(length){}
a_struct() : dynamic_array() {}
};
class a_class
{
public:
std::vector<a_struct> the_structs;
a_class() {Init();}
a_class(a_class const & origin) {Init();}
void Init()
{
the_structs.resize(10);
for(int q=0; q<10; q++)
the_structs[q] = a_struct(7);
}
};
問題是a_struct
沒有正確的復制構造函數和operator =
。 因此,一次有兩個a_struct::dynamic_array
指向同一個 memory 位置,並且都將調用delete[] dynamic_array;
在析構函數中。 因此,雙重刪除。
永遠記住,只要你在class
中有一個行指針,你就應該做一個深拷貝(復制指針指向的內容)而不是淺拷貝(只是地址)。
在您的情況下,您可以像這樣更改定義:
struct a_struct
{
int length_; //<<--- add this for record
int* dynamic_array;
a_struct(int length) : length_(length) {dynamic_array = new int [length_]; }
a_struct() : dynamic_array(NULL) {}
a_struct(const a_struct ©) // <<--- copy ctor
{
do_copy(copy);
}
a_struct& operator = (const a_struct ©) // <<--- assignment operator
{
delete[] dynamic_array; // clear earlier array
do_copy(copy);
return *this;
}
~a_struct() { if (dynamic_array != NULL) {delete [] dynamic_array;} } //Line A
void do_copy (const a_struct ©)
{
// do necessary null checks for "copy"
dynamic_array = new int[length_ = copy.length];
memcpy(dynamic_array, copy.dynamic_array, length_);
}
};
您對任何此類class
采取相同的預防措施。
問題是a_struct
中隱式生成的復制構造函數不會進行深度復制,但析構函數始終假定為每個實例分配了 memory。 您需要為它創建一個復制構造函數來進行深度復制。 但更好的是只使用std::vector
而不是 new 和 delete。 然后,您不必擔心要記住保持所有構造函數正確。
此外, a_class
的復制構造函數實際上並不復制 object。 當它不支持預期的復制語義時,這幾乎肯定會在某個時候給您帶來問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.