2013-03-19 37 views
7

Tôi có chương trình thực hiện cơ sở dữ liệu của các dân tộc và công ty của mình. Tôi đã tạo ra mảng động của con trỏ đến các thành viên lớp thay vì mảng động của các thành viên lớp, gây ra sao chép nhanh hơn với nó.Không phù hợp xóa

Tôi có phiên bản mà hoạt động nhưng valgrind cho thấy không phù hợp xóa trong destructor (xóa db)

CCompany** db; 

~CCompanyIndex (void) 
{ 
    for(unsigned i=0;i<len;i++) 
    { 
     /*cout<<"dealloc:"<<db[i]<<endl;*/ 
     delete db[i]; 
    } 
    delete db; 
} 

CCompanyIndex (void) 
{ 
    max=1000; 
    len=0; 
    db=new CCompany*[max]; 
} 

Tôi cũng sử dụng để thêm

CCompany* newIt=new CCompany(oName,oAddr,cName,cAddr); 

Vì vậy, tôi đã cố gắng mã sau đây mà tôi xem xét chính xác trước đó

~CCompanyIndex (void) 
{ 
    delete [] db; 
} 

Nhưng sau đó tất cả bộ nhớ được phân bổ bằng cách thêm phương pháp không được deallocated.

+3

(1) Bạn có quen thuộc với [Quy tắc ba] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three) không? (2) Bạn có coi con trỏ thông minh và thùng chứa thay vì con trỏ thô và bộ nhớ được cấp động không? –

Trả lời

11

Mẫu đầu tiên gần như chính xác. Bạn đang xóa từng phần tử trong một vòng lặp for, nhưng sau đó bạn cố gắng để delete mảng.

for(unsigned i=0;i<len;i++) { delete db[i]; } 
delete db; 

Nó thay vào đó nên là:

for(unsigned i=0;i<len;i++) { delete db[i]; } 
delete[] db; 

Bất cứ khi nào bạn sử dụng new ...[], bạn nên sử dụng delete[].

Ngoài ra, đừng quên Rule of Three (hoặc Five (hoặc Zero)).

+3

Hoặc không ......... – juanchopanza

1

Bạn cần delete db[i] cho mỗi thành phần nhưng delete[] db cho chính mảng đó, vì vậy không có trình phá hủy nào là chính xác.

Mảng phân bổ với new Foo[n] phải được deallocated với dạng mảng, delete[], đó là những gì valgrind nghĩa về không phù hợp mới/xóa

+1

Vẫn còn tốt hơn, không sử dụng 'new []' hoặc 'delete []'. Sử dụng một vector và được hạnh phúc. –

2

Bạn đang sử dụng sai delete. Thực hiện việc này:

CCompanyIndex::~CCompanyIndex() 
{ 
    for(unsigned i=0; i<len;i++) delete db[i]; 
    delete [] db; 
} 

Lưu ý cuộc gọi delete [].