sau một cuộc thảo luận trong một cuộc họp phần mềm tôi đã đặt ra để tìm hiểu xem việc xóa mảng động, được phân bổ nguyên thủy có đồng bằng delete
sẽ gây ra rò rỉ bộ nhớ hay không.Xóa p trong đó p là một con trỏ tới mảng luôn luôn bị rò rỉ bộ nhớ?
Tôi đã viết chương trình nhỏ này và biên dịch nó với Visual Studio 2008 chạy trên windows XP:
#include "stdafx.h"
#include "Windows.h"
const unsigned long BLOCK_SIZE = 1024*100000;
int _tmain()
{
for (unsigned int i =0; i < 1024*1000; i++)
{
int* p = new int[1024*100000];
for (int j =0;j<BLOCK_SIZE;j++) p[j]= j % 2;
Sleep(1000);
delete p;
}
}
tôi hơn giám sát mức tiêu thụ bộ nhớ của ứng dụng của tôi sử dụng task manager, đáng ngạc nhiên bộ nhớ được cấp phát và giải phóng một cách chính xác , bộ nhớ phân bổ không đều đặn tăng như đã được dự kiến
tôi đã sửa đổi chương trình thử nghiệm của tôi để phân bổ một loại nguyên thủy mảng phi:
#include "stdafx.h"
#include "Windows.h"
struct aStruct
{
aStruct() : i(1), j(0) {}
int i;
char j;
} NonePrimitive;
const unsigned long BLOCK_SIZE = 1024*100000;
int _tmain()
{
for (unsigned int i =0; i < 1024*100000; i++)
{
aStruct* p = new aStruct[1024*100000];
Sleep(1000);
delete p;
}
}
sau khi chạy trong 10 phút không có sự gia tăng có ý nghĩa trong bộ nhớ
Tôi đã biên soạn dự án với mức cảnh báo 4 và không có cảnh báo.
có thể là thời gian chạy của studio trực quan theo dõi các loại đối tượng được phân bổ sao cho không có sự khác biệt giữa delete
và delete[]
trong môi trường đó?
Sao chép? http://stackoverflow.com/questions/1913343/how-could-pairing-new-with-delete-possibly-lead-to-memory-leak-only –
@Philip Potter: Không phải là câu hỏi rất hay - đó là câu hỏi cụ thể về việc gây ra rò rỉ bộ nhớ. Và rò rỉ bộ nhớ không phải là điển hình trong trường hợp này. – sharptooth
Hãy thử nó với một mảng 'shared_ptr', mỗi trỏ đến một int được phân bổ khác nhau, và bạn sẽ thấy liệu việc triển khai của bạn có làm cho 'delete' và' delete [] 'tương đương hay không. Luôn luôn niềm đam mê này trong C + + với những điều mà mọi người biết là sai, được nêu rõ trong tiêu chuẩn là sai, và chưa xuất hiện như thể họ đôi khi chỉ xảy ra để làm việc ;-) –