c ++函数参数编辑

Vir*_*cks 1 c++ pointers arguments function

我正在进行内存分配/释放功能,
这很简单

inline void safedealloc ( void *mem )
{
     if ( mem ) { free( mem ); mem = NULL; }
}  
Run Code Online (Sandbox Code Playgroud)

它工作正常..然而,在使用它几次与程序后,
我注意到它在类似的东西中调用它

safedealloc( (char *)name );
safedealloc( (char *)name );
Run Code Online (Sandbox Code Playgroud)

导致错误.. 第一次调用后名称应该为null.但它没有,第二次使用无效指针ofc导致错误..为什么不将null分配给名称,因为它应该?

PS:使用malloc正确分配名称,并使用有效的大小和内容

小智 7

它几乎肯定不能正常工作,它毫无意义,而在C++中,你分配内存的方式是使用new和delete,而不是malloc和free.不需要检查空指针 - 在C和C++中都很好地定义了free(NULL).你对函数参数的NULL赋值什么也没做 - 它只修改参数,而不是修改它在调用程序中的值.

最后,如果您发现自己编写的代码如下:

char * p = malloc(100);
safefree( p );
safefree( p );
Run Code Online (Sandbox Code Playgroud)

要做的是修复代码,这样你就不会将指针释放两次,而不是通过在坏代码上粘贴创可贴来混淆事物.

  • @Peter显然没有"内存池",因为他正在使用free().如果它是一个嵌入式平台,他可能会非常不愿意使用动态分配.我称之为bullsh*t. (4认同)
  • @peter填充你的代码`if(p == NULL)`的东西是可怕的编程习惯. (3认同)

Meh*_*dad 5

mem = NULL;什么都不做,因为mem是一个不同的变量.

试试这个(注意&前面的mem,这意味着参考mem):

template<typename T> //I added this due to request, since this doesn't quite work
                     //with pointers other than void*
inline void safedealloc ( T *& mem )
{
     if ( mem ) { free( mem ); mem = NULL; }
}
Run Code Online (Sandbox Code Playgroud)

这实际上是不是一个好主意是一个完全不同的问题.
答案是否定的.为什么?因为如果你在这里犯了这个错误,你可能会在其他地方犯同样的错误,问题就会重新开始,除非这次它在堆栈中更高并且更难找到.

  • 这仍然浪费时间. (2认同)
  • @Mehrad倡导良好实践应该是你的问题. (2认同)