【问题标题】:Freeing returned variable in C在 C 中释放返回的变量
【发布时间】:2014-11-25 19:36:01
【问题描述】:

假设我有以下设置:

struct matrix
{
    int row, col;
};

struct matrix* createMatrix(int row, int col)
{
    struct matrix* t_matrix;
    t_matrix = (struct matrix*) malloc(sizeof(struct matrix));
    t_matrix->row = row;
    t_matrix->col = col;

    return t_matrix;
}

然后我想要一个临时返回结构矩阵*,但不改变原始矩阵的函数(非常重要):

struct matrix* transpose(struct matrix* mat)
{
    return createMatrix(mat->col, mat->row);
}

我现在如何释放这个转置矩阵,但仍暂时使用它的值?

编辑:删除了 createMatrix 的不必要参数

已解决:正如一些人建议的那样,我最终创建了一个指向我所有矩阵的指针,并在结束程序时释放它们。

【问题讨论】:

  • 请注意,createMatrix() 不会使用struct matrix*
  • transpose的返回值上使用free有什么问题吗?
  • 我的实际 createMatrix 函数与此不同,所以我有点困惑:P 我修复了它。
  • @RSahu 我会在哪里做呢?它返回后我无法释放它,如果我调用 transpose(matrix) 然后我尝试 free(transpose(matrix)) 它将释放一个不同的矩阵。
  • 为什么会释放不同的矩阵?它会释放相同的内存...

标签: c return malloc


【解决方案1】:

通常,您会在函数的文档中说明它返回一个新的对象矩阵(即,它不会更改作为参数传递的任何矩阵),并且调用代码有责任在它被释放时释放它不再使用。

另一种可能性是将这些新创建的矩阵的列表存储在某处,并在根据某些标准知道它们不再使用时处置或重用它们;例如使用标志、时间戳等。

【讨论】:

  • 我的问题是,我怎样才能释放矩阵?我不能调用 free(tranpose(matrix)) 因为这将释放一个已创建的新矩阵,所以我将有两个转置矩阵,一个将被释放,然后我还将拥有原始矩阵。
  • 您需要将每个矩阵的值(或者更准确地说,它的地址)存储在它自己的指针中,或者使用某种集合对象来存储它们。
【解决方案2】:

要记住的关键点是每个malloc 都需要一个free。下面是一些示例代码,说明了如何使用这些函数。

// Create a matrix
struct matrix* m1 = createMatrix(10, 15);

// Create a transpose of the matrix.
struct matrix* mt1 = transpose(m1)

// Create another transpose of the matrix.
struct matrix* mt2 = transpose(m1)

// Free the second transposed matrix
free(mt2);

// Free the first transposed matrix
free(mt1);

// Free the original matrix
free(m1);

【讨论】:

    猜你喜欢
    • 2011-01-18
    • 1970-01-01
    • 2015-06-21
    • 2012-10-10
    • 2017-01-10
    • 2011-01-26
    • 2018-07-29
    • 2019-10-11
    • 2017-12-02
    相关资源
    最近更新 更多