在释放指向它们的内容后重用指针变量是否安全?

时间:2009-02-02 21:16:14

标签: c memory pointers

在释放指向的数据后重用指针是否安全且可预测?

例如:

char* fileNames[] = { "words.txt", "moreWords.txt" };
char** words = NULL;
int* wordsCount = NULL;
for ( i = 0; i < 2; ++i ) {
    data = fopen( fileNames[i], "r" );
    words = readWords( data );
    wordsCount = countWords( words );

    free( wordsCount );
    for ( j = 0; words[j]; ++j )
        free( words[j] );
    free( words );
    fclose( data );
}

*错误检查省略

我正在运行代码,它似乎运行(没有警告,错误或内存问题),但我想知道在大多数环境中(特别是在典型的Linux环境中)这是否安全且可预测?

如果这不是'安全且可预测的',那么在两个不同文件上完成相同操作的最佳方法是什么,不是创建指针数量的两倍,等等?

编辑:我在询问是否可以在释放指向的内容后重新使用指针变量。我知道你在释放后不应该使用指针。 假设代码完美运行(它按预期工作,正确释放内存等)。我无法改变规格。这项任务。

谢谢!

9 个答案:

答案 0 :(得分:22)

你正在做的事情很好:因为,在你发布一个指针后,你会在重复使用它之前重新初始化它。

如果问题是“释放后重用指针是否安全”,则答案为“否”。

如果问题是“在释放其值后重用指针变量是否安全”,则答案为“是,如果您在重新使用它之前将其重新初始化为(新)有效值”

答案 1 :(得分:3)

是。那很安全。 (丑,但安全:))

答案 2 :(得分:1)

我说不出来。它看起来很安全,但我没有看到内存分配,所以我无法确定你是否正在释放正确的东西。

答案 3 :(得分:1)

重复使用它我看不出任何技术问题。从可读性和可维护性的角度来看可能会造成损害并增加出错的可能性。

答案 4 :(得分:1)

将其他东西分配给同一个指针是安全的。重新使用免费内存绝对不安全。有一次,很多代码会释放一块内存,然后使用它就好像它没有被自由编辑一样。当代码被移植到对该范例不太满意的其他操作系统时,它引起了大量问题。

答案 5 :(得分:1)

我不清楚你重复使用的意思。

如果你的意思是:

int* pInt = new int;
*pInt = 3;
delete pInt;

pInt = new int;

然后是的,这是安全的。

答案 6 :(得分:0)

没有

另一个提示 - 只是因为你在没有被击中的情况下穿过高速公路也不会那么安全。

您认为哪些指针“重用”?虽然我假设readWords和countWords分配内存,但我没有看到它被释放后被使用的东西。如果他们不这样做,那你就会遇到更大的问题。

答案 7 :(得分:0)

不清楚,因为未显示分配。

一般情况下,在释放指向其后指向其他内容的指针时,可以安全地重新指定指针。

答案 8 :(得分:0)

首先,我没有看到过早的“解放”(没有撇号!)。您认为您在哪里访问已经释放的数据?

此外,即使您在释放数据后访问数据,也取决于系统是否有些安全。系统可能会选择将释放的内存提供给其他进程以立即重用,而其他系统,特别是如果您使用相当私有的lib函数(如malloc),可能只使用仅适用于您的这一个进程的内存,所以没有将会释放内存,因为系统的其他任何部分都不会知道它。