我正在编写一个返回2D数组的函数。这让我想到了在C#(有垃圾回收)和C++(没有垃圾回收)中的影响。
为什么两者都需要呢?你可能会问:我现在在Windows平台上使用C#编写它,但几个月后我将在使用C++的嵌入式设备上实现我的算法。
所以基本上我有一个2D数组,比如说table,并通过一个函数将其分配给了返回值。我的问题是:原始存储原始table的内存块会发生什么?
现在来看代码:
在C#中:
为什么两者都需要呢?你可能会问:我现在在Windows平台上使用C#编写它,但几个月后我将在使用C++的嵌入式设备上实现我的算法。
所以基本上我有一个2D数组,比如说table,并通过一个函数将其分配给了返回值。我的问题是:原始存储原始table的内存块会发生什么?
现在来看代码:
在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)。当table被分配为10x10的表时,是否会造成内存泄漏?如何避免这种情况?
vector<vector<int>>
)来避免担心内存释放问题。 - Jarod42createTable
函数本身已经存在潜在的泄漏问题,因为每个new
操作都可能会抛出异常。请不要试图根据某些类似语法在另一种语言中编写C++代码,这将导致非常糟糕的结果。如果想要编写好的C++代码,请系统地学习这门语言并阅读优秀的书籍。 - Baum mit Augen