[英]Valgrind does not report memory leak on “delete array”
在實現下面的C ++代碼之后,我運行valgrind --leak-check=full
來檢查是否有任何內存泄漏。 結果是在出口處使用了0個字節,並且不可能泄漏 。
但是,后來我發現我已經忘記使用delete[] x
而不是僅僅在析構函數中delete x
了。
我搜索了一些解釋(例如: C ++中的delete vs delete []運算符 ),並且我讀到的所有內容都說使用不帶[]
delete
可能會導致內存泄漏,因為它僅調用數組中第一個對象的析構函數。
我將代碼更改為delete [],並且valgrind輸出是相同的(與預期的一樣)。 但是現在我很困惑: “ valgrind是否存在問題,或者即使沒有運算符[]
, delete
對於數組也確實有效嗎?”
#include <iostream>
#include <string.h>
using namespace std;
class Foo {
private: char *x;
public:
Foo(const char* px) {
this->x = new char[strlen(px)+1];
strcpy(this->x, px);
}
~Foo() {
delete x;
}
void printInfo() { cout << "x: " << x << endl; }
};
int main() {
Foo *objfoo = new Foo("ABC123");
objfoo->printInfo();
delete objfoo;
return 0;
}
使用不帶[]的刪除會導致內存泄漏。
不,它會導致Undefined Behavior 。
您使用new []
分配並使用delete
取消分配的程序具有未定義的行為。 實際上,您很幸運(而不是幸運),它沒有表現出一些奇怪的行為。
附帶說明,您還需要在課堂上遵循三規則 。 目前,您還沒有這樣做,並且在不久的將來會遇到麻煩。
delete
和delete[]
之間的主要區別不在於內存釋放,而在於析構函數調用。
盡管是形式上未定義的行為 ,但實際上它會或多或少地起作用……除了delete
只會調用第一項的析構函數。
附帶說明,您可能會遇到問題:
#include <iostream>
struct A{
~A() { std::cout << "destructor\n"; }
};
int main() {
A* a = new A[10];
delete a;
}
有一點像:
*** glibc detected *** ./prog: munmap_chunk(): invalid pointer: 0x093fe00c ***
======= Backtrace: =========
/lib/libc.so.6[0xb759dfd4]
/lib/libc.so.6[0xb759ef89]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/libstdc++.so.6(_ZdlPv+0x21)[0xb77602d1]
./prog(__gxx_personality_v0+0x18f)[0x8048763]
./prog(__gxx_personality_v0+0x4d)[0x8048621]
======= Memory map: ========
在ideone上看到它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.