Bởi vì bạn (un) may mắn. auto_ptr
gọi delete
, không phải delete []
. Đây là hành vi không xác định.
Hãy thử làm một cái gì đó như thế này và xem liệu bạn có được may mắn như:
struct Foo
{
char *bar;
Foo(void) : bar(new char[100]) { }
~Foo(void) { delete [] bar; }
}
int iterCount = 1000;
int sizeBig = 100000;
for (int i = 0; i < iterCount; i++)
{
std::auto_ptr<Foo> buffer(new Foo[sizeBig]);
}
Ý tưởng ở đây là destructor của bạn cho Foo
sẽ không được gọi.
Lý do là một cái gì đó như thế này: Khi bạn nói delete[] p
, việc thực hiện delete[]
là giả sử để đi đến từng phần tử trong mảng, gọi destructor của nó, sau đó giải phóng bộ nhớ được trỏ đến bởi p. Tương tự, delete p
giả sử gọi hàm hủy trên p, sau đó giải phóng bộ nhớ.
char
không có trình phá hủy, do đó, nó sẽ xóa bộ nhớ được trỏ tới bởi p. Trong mã của tôi ở trên, nó là không sẽ hủy mỗi phần tử trong mảng (vì nó không gọi delete[]
), do đó, một số Foo sẽ để biến thanh địa phương của chúng chưa được xóa.
Trong hầu hết các trường hợp, nếu bạn ghép nối mới với xóa [] và ngược lại với các loại không tầm thường thì điều này không gây ra rò rỉ - thay vào đó chương trình chỉ đơn giản là treo khi cố gắng xử lý bộ nhớ. – sharptooth
Bạn có thể thử sử dụng boost :: scoped_array thay vì std :: auto_ptr –