简体   繁体   English

我的 memory 在 C++ 程序中泄露

[英]My memory leak in C++ program

I'm faced a new problem something with memory allocation and leak here is my error log:我遇到了 memory 分配和泄漏的新问题,这是我的错误日志:

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

Struct:结构:

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

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

Constructor:构造函数:

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;
       }
    }
}

The program errors me only for some function of ti for example function:该程序仅针对 ti 的某些 function 使我出错,例如 function:

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";
            }
        }
    }

}

So short, I have a structure Arr ( Matrix of 31*6) were I store ints (different types of expenses) but when I use some of my functions I get Segmentation fault.简而言之,我有一个结构Arr (31 * 6 的矩阵)是我存储整数(不同类型的费用)但是当我使用我的一些函数时我得到分段错误。 I have no experience with this kind of errors, so any advices are useful.我没有遇到过这种错误,所以任何建议都是有用的。

EDIT:编辑:

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];
   }
}
}

Follow the rule "Deallocate every block of memory that you have allocated dynamically"遵循规则“释放动态分配的 memory 的每个块”

Deallocate using delete the memory you have allocated using new解除分配使用delete您使用new分配的 memory

This may throw some light for you http://www.cplusplus.com/doc/tutorial/dynamic/这可能会给你一些启发 http://www.cplusplus.com/doc/tutorial/dynamic/

If you allocated an array using new[] then delete it using delete[]如果您使用new[]分配了一个数组,则使用delete[]删除它

In this case i would suggest you to write a constructor and destructor for the struct Arr instead of writing normal functions.在这种情况下,我建议您为struct Arr编写构造函数和析构函数,而不是编写普通函数。

// I hope you intended to write j<5
for (int j=0; i<5; j++){  //infinite Loop... as j is still 0

So what happens with the statement i<5 in your program is, your inner for loop becomes an indefinite loop and tries to access unallocated memory.那么你的程序中的语句i<5会发生什么,你的内部 for 循环变成一个无限循环并尝试访问未分配的 memory。

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    }

i see you're delete[]'ing loc->M[i] (line 3) and yet you still references it's contents at line 5.我看到你正在 delete[]'ing loc->M[i](第 3 行),但你仍然在第 5 行引用它的内容。

I suggest this is a bug as you've handed the memory back to the heap and any other part of your application can now re-use it.我建议这是一个错误,因为您已将 memory 交还给堆,应用程序的任何其他部分现在都可以重新使用它。 So by the time your application gets to line 5 it may not have the contents you expect.因此,当您的应用程序到达第 5 行时,它可能没有您期望的内容。

I'd suggest rewriting it as...我建议将其重写为...

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    }

The destructor in seems to be strange里面的析构函数好像很奇怪

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
   }
}

Destructor should look the following way (in accordance to constructor):析构函数应如下所示(根据构造函数):

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM