2012-04-04 3 views
1

Я столкнулся с новой проблемой что-то с выделением памяти и утечки здесь мой журнал ошибок:Моя утечка памяти в программе C++

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

Программа меня исправляет только для некоторой функции 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), я хранил ints (разные виды расходов), но когда я использую некоторые из своих функций, я получаю ошибку сегментации. У меня нет опыта с такими ошибками, поэтому любые советы полезны.

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

Я вижу 'новый', но не' delete'. – Pubby

+2

Я предлагаю вам заменить 'int ** M' на' std :: vector > '. На самом деле, есть более эффективные подходы, но это будет иметь наименьшее влияние на существующее решение. –

+0

Дело в том, что я должен использовать свою собственную структуру: | –

ответ

0

Деструктор в кажется странным

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

Следуйте правилу "DEALLOCATE каждый блок памяти, который вы выделили динамически"

Освобождает с помощью delete памяти вы выделили с помощью new

Это может ввергать свет для вас http://www.cplusplus.com/doc/tutorial/dynamic/

Если вы выделили массив, используя new[] затем удалите его с помощью delete[]

В этом случае я предлагаю вам написать конструктор и деструктор для struct Arr вместо того, чтобы писать обычные функции.

+0

Правильно ли это? Я отредактировал псот и добавил деконструктор. –

+1

Вы смешиваете 'delete []' и 'delete' с' new' и 'new []' –

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

Так что же происходит с утверждением i<5 в вашей программе, ваш внутренний цикл становится бесконечным цикл и пытаются получить доступ к нераспределенной памяти.

+0

good Spot !! это должна быть опечатка –

1
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 [я] (строка 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 } 
Смежные вопросы