簡體   English   中英

Valgrind不報告“刪除數組”上的內存泄漏

[英]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取消分配的程序具有未定義的行為。 實際上,您很幸運(而不是幸運),它沒有表現出一些奇怪的行為。

附帶說明,您還需要在課堂上遵循三規則 目前,您還沒有這樣做,並且在不久的將來會遇到麻煩。

deletedelete[]之間的主要區別不在於內存釋放,而在於析構函數調用。

盡管是形式上未定義的行為 ,但實際上它會或多或少地起作用……除了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM