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)
要做的是修复代码,这样你就不会将指针释放两次,而不是通过在坏代码上粘贴创可贴来混淆事物.
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)
这实际上是不是一个好主意是一个完全不同的问题.
答案是否定的.为什么?因为如果你在这里犯了这个错误,你可能会在其他地方犯同样的错误,问题就会重新开始,除非这次它在堆栈中更高并且更难找到.