返回一个2D数组(在C#和C ++中)

时间:2017-08-09 08:38:42

标签: c# c++ arrays garbage-collection

我正在编写一个返回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表时,它是否会产生内存泄漏?我该如何避免这种情况?

3 个答案:

答案 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 ++,对不起。