我正在编写一个返回2D数组的函数。这让我想一想这在C#(垃圾收集)和C ++(没有GC)中的含义
(为什么在两者中 - 你可能会问:我现在用C#在Windows平台上编写它,但在几个月内我将使用C ++在嵌入式设备上实现我的算法)
所以基本上我有一个2D数组说表,并通过我赋给它的函数返回值。我的问题是:持有原始表的原始内存会发生什么?
现在到代码: 在C#
using System;
public class Test
{
public static void Main()
{
int[,] table= new int [10,10]; //Here some memory is separated for table
int[,] table= createTable(10,10); //Here the return value of createTable is assigned to the original value
//WHAT HAPPENED TO THE ORIGINAL MEMORY THAT table HAD?
printTable(table,10,10); //disregard this. Not that important
}
public static int[,] createTable(int rows, int columns)
{
int[,] t = new int[rows,columns];
for(int i=0;i<rows;i++)
for(int j=0;j<columns;j++)
t[i,j]=(i+j);
return t;
}
public static void printTable(int[,]t, int rows, int columns)
{
for(int i=0;i<rows;i++)
for(int j=0;j<columns;j++)
Console.WriteLine(t[i,j]);
foreach( var im in t)
Console.WriteLine(im);
}
}
(请不要告诉我第一个新的int是没有必要的,等等。这个问题是必要的,可以通过调用createTable两次来代替)
我猜测在C#中,垃圾收集器负责这个,我不用担心吗?
现在用C ++
#include <cstdio>
#include <cstdlib>
int** createTable(int rows, int columns){
int** table = new int*[rows];
for(int i = 0; i < rows; i++) {
table[i] = new int[columns];
for(int j = 0; j < columns; j++){ table[i][j] = (i+j); }// sample set value;
}
return table;
}
void freeTable(int** table, int rows){
if(table){
for(int i = 0; i < rows; i++){ if(table[i]){ delete[] table[i]; } }
delete[] table;
}
}
void printTable(int** table, int rows, int columns){
for(int i = 0; i < rows; i++){
for(int j = 0; j < columns; j++){
printf("(%d,%d) -> %d\n", i, j, table[i][j]);
}
}
}
int main(int argc, char** argv){
int** table = createTable(5, 5);
table = createTable(10,10);
printTable(table, 10, 10);
freeTable(table, 10);
return 0;
}
表(5x5)保存的原始内存发生了什么。当表被分配10x10表时,它是否会产生内存泄漏?我该如何避免这种情况?
答案 0 :(得分:2)
对于C ++部分,是的,你创建了内存泄漏。你必须调用freeTable
:
int** table = createTable(5, 5);
freeTable(table, 5);
table = createTable(10,10);
printTable(table, 10, 10);
freeTable(table, 10);
最好将Raii对象用作vector<vector<int>>
(或专用类Matrix
)以避免担心内存释放(并且您也可以在类中添加大小信息)。
所以它只是:
auto table = createTable(5, 5);
table = createTable(10,10);
printTable(table);
答案 1 :(得分:2)
在C#中,垃圾收集器将处理无法再访问的内存。
我用gcc(版本:(Debian 6.4.0-1)6.4.0 20170704编译了你的C ++程序 )关于Debian Buster。
{
"KARIM BENNI" : {
"2017-08-07 09:50:50" : {
"Anomalie" : {
"description" : "Test",
"theme" : "Engins mobiles"
},
"date" : "2017-08-07",
"date_now" : "2017-08-07 09:50:50",
"entite" : "USINE LAMINAGE A FROID",
"etat" : "Cree",
"nb_personne" : 2,
"temps" : 5,
"visiteur" : "KARIM BENNI",
"visite" : "AHMED RABII",
"zone" : "COUPE"
}
}
}
这是检查各种内存问题的非常有用的工具,使用valgrind
给了我以下输出:
valgrind --leak-check=full ./test
正如你所看到的,你肯定会失去记忆力。 首先调用freeTable()函数,然后重新指定指针或使用smart pointers来解决此问题。
答案 2 :(得分:0)
在这一行:
//WHAT HAPPENED TO THE ORIGINAL MEMORY THAT table HAD?
你正在覆盖它的引用。由于原始表不再被引用,因此垃圾收集将在运行后清理已用空间。
我无法回答有关问题的C ++,对不起。