[英]My memory leak in C++ program
我遇到了 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
結構:
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 的某些 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";
}
}
}
}
簡而言之,我有一個結構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];
}
}
}
遵循規則“釋放動態分配的 memory 的每個塊”
解除分配使用delete
您使用new
分配的 memory
這可能會給你一些啟發 http://www.cplusplus.com/doc/tutorial/dynamic/
如果您使用new[]
分配了一個數組,則使用delete[]
刪除它
在這種情況下,我建議您為struct Arr
編寫構造函數和析構函數,而不是編寫普通函數。
// I hope you intended to write j<5
for (int j=0; i<5; j++){ //infinite Loop... as j is still 0
那么你的程序中的語句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 }
我看到你正在 delete[]'ing loc->M[i](第 3 行),但你仍然在第 5 行引用它的內容。
我建議這是一個錯誤,因為您已將 memory 交還給堆,應用程序的任何其他部分現在都可以重新使用它。 因此,當您的應用程序到達第 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 }
里面的析構函數好像很奇怪
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.