【问题标题】:My memory leak in C++ program我在 C++ 程序中的内存泄漏
【发布时间】:2012-04-17 18:53:31
【问题描述】:

我在内存分配和泄漏方面遇到了一个新问题,这是我的错误日志:

Dr. Memory version 1.4.6 build 2 built on Mar  7 2012 10:14:04
Application cmdline: ""D:\c++\Begin\Lab3-5_OOP\Debug\Lab3-5_OOP.exe""
Recorded 62 suppression(s) from default C:\Program Files (x86)\Dr. Memory/bin/suppress-default.txt

Error #1: UNINITIALIZED READ: reading register eax
# 0 _fu89___ZSt4cout               [D:\c++\Begin\Lab3-5_OOP\Debug/../Controller.cpp:156]
# 1 main                           [D:\c++\Begin\Lab3-5_OOP\Debug/../M.cpp:25]
Note: @0:00:00.924 in thread 4584
Note: instruction: test   %eax %eax

Error #2: LEAK 12 direct bytes 0x00531420-0x0053142c + 1024 indirect bytes
# 0 libstdc++-6.dll!Znwj           
# 1 constr()               [D:\c++\Begin\Lab3-5_OOP\Debug/../ListStruc.cpp:24]
# 2 main                   [D:\c++\Begin\Lab3-5_OOP\Debug/../M.cpp:18]

Error #3: LEAK 12 direct bytes 0x009bec48-0x009bec54 + 1024 indirect bytes
# 0 libstdc++-6.dll!Znwj  +0x23     (0x6fcbb523 <libstdc++-6.dll+0x7b523>)
# 1 constr()               [D:\c++\Begin\Lab3-5_OOP\Debug/../ListStruc.cpp:24]
# 2 main                   [D:\c++\Begin\Lab3-5_OOP\Debug/../M.cpp:20]

DUPLICATE ERROR COUNTS:

SUPPRESSIONS USED:

ERRORS FOUND:
      0 unique,     0 total unaddressable access(es)
      1 unique,     1 total uninitialized access(es)
      0 unique,     0 total invalid heap argument(s)
      0 unique,     0 total warning(s)
      2 unique,     2 total,   2072 byte(s) of leak(s)
      0 unique,     0 total,      0 byte(s) of possible leak(s)
ERRORS IGNORED:
     78 still-reachable allocation(s)
         (re-run with "-show_reachable" for details)
Details: C:\Users\Warzaru\AppData\Roaming/Dr. Memory/DrMemory-Lab3-5_OOP.exe.10024.000/results.txt

结构:

const int days=31;
const int exp=6;

struct Arr{
    int days;
    int exp;
    int **M;
};
typedef Arr* Array;

构造函数:

void constr(Array &loc){
    //Construct of 31*6 Matrix, were 31 nr. of days and 6 specific types:
    //0-HouseKeeping, 1-Food, 2-Transport, 3-Clothing, 4-TelNet, 5-others
    loc=new Arr;
    loc->days = days;
    loc->exp = exp;
    loc->M = new int*[loc->days];
    for(int i=0; i<loc->days;i++ ){
       loc->M[i] = new int[loc->exp];
       for (int j = 0; j < loc->exp; j++){
           loc->M[i][j] = 0;
       }
    }
}

程序仅对 ti 的某些功能出错,例如功能:

void maxDay(Array &M){
    //Output the day with highest value
    cout<<"test";
    int hD = 0;
    int s1 = 0;
    int s2 = 0;
    cout<<"test";
    for(int i = 0; i<30;i++){
        s1=0;
        for (int j=0; i<5; j++){
            s1 = s1 + M->M[i][j];
            if(s2 <= s1){
                s2 = s1;
                hD = i;
                cout<<"test";
            }
        }
    }

}

这么短,我有一个结构 Arr(31*6 的矩阵),我存储整数(不同类型的费用),但是当我使用我的一些函数时,我得到了分段错误。我对这种错误没有经验,所以任何建议都是有用的。

编辑:

void destruc(Array &loc){
    for(int i=0; i<loc->days;i++ ){
       delete[] loc->M[i];
       for (int j = 0; j < loc->exp; j++){
           delete[] loc->M[i][j];
   }
}
}

【问题讨论】:

  • 我看到了new,但没有看到delete
  • 我建议您将int **M 替换为std::vector&lt; std::vector&lt;int&gt; &gt;。实际上,有更好的方法,但这对您现有的解决方案的影响最小。
  • 问题是我必须使用自己的结构:|
  • @BogdanMaier:如果这是作业,您需要将其标记为作业,否则您将得到正确/合适的答案,由于作业指南施加的限制,您无法使用。跨度>
  • 好的,谢谢你,我会记住未来

标签: c++ memory-leaks new-operator delete-operator


【解决方案1】:

遵循规则“释放你动态分配的每个内存块”

使用delete 释放您使用new 分配的内存

这可能会给你一些启发http://www.cplusplus.com/doc/tutorial/dynamic/

如果您使用new[] 分配了一个数组,则使用delete[] 删除它

在这种情况下,我建议您为struct Arr 编写构造函数和析构函数,而不是编写普通函数。

【讨论】:

  • 这样对吗?我编辑了 psot 并添加了解构函数。
  • 您将delete[]deletenewnew[] 混合使用
【解决方案2】:
// I hope you intended to write j<5
for (int j=0; i<5; j++){  //infinite Loop... as j is still 0

那么在您的程序中使用语句 i&lt;5 会发生什么,您的内部 for 循环变成了一个无限循环并尝试访问未分配的内存。

【讨论】:

    【解决方案3】:
    1    void destruc(Array &loc) {
    2        for(int i=0; i<loc->days;i++ ) {
    3            delete[] loc->M[i];
    4            for (int j = 0; j < loc->exp; j++) {
    5                delete[] loc->M[i][j];
    6            }
    7        }
    8    }
    

    我看到你正在删除 []'ing loc->M[i](第 3 行),但你仍然在第 5 行引用它的内容。

    我认为这是一个错误,因为您已将内存交还给堆,并且您的应用程序的任何其他部分现在都可以重用它。因此,当您的应用程序到达第 5 行时,它可能没有您期望的内容。

    我建议将其重写为...

    1    void destruc(Array &loc) {
    2        for(int i=0; i<loc->days;i++ ) {
    3            for (int j = 0; j < loc->exp; j++) {
    4                delete[] loc->M[i][j];
    5            }
    6            delete[] loc->M[i];
    7        }
    8    }
    

    【讨论】:

      【解决方案4】:

      里面的析构函数好像很奇怪

      void destruc(Array &loc){
          for(int i=0; i<loc->days;i++ ){
             delete[] loc->M[i]; <-------------- deleting array of pointers to array
             for (int j = 0; j < loc->exp; j++){
                 delete[] loc->M[i][j]; <------- deleting pointer to array that
                                                 is already deallocated
         }
      }
      

      析构函数应该如下所示(根据构造函数):

      void destruc(Array &loc){
          for(int i=0; i<loc->days;i++ ){
             delete[] loc->M[i];
          }
          delete[] M;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-09
        • 2021-04-17
        相关资源
        最近更新 更多