关于网友提出的“ 怎么避免两个指向同一个地址的多次释放问题”问题疑问,本网通过在网上对“ 怎么避免两个指向同一个地址的多次释放问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 怎么避免两个指向同一个地址的多次释放问题
描述:本帖最后由 wallwind 于 2014-03-05 20:44:48 编辑
c语言指针
比如以下代码
#include
#include
int main()
{
int *ptr = malloc(10*sizeof(int));
int *ptr2 = ptr;
if(ptr)
{
free(ptr);
ptr =NULL;
printf("delete one");
}
if(ptr2)
{
free(ptr2);
ptr2=NULL;
printf("delete two");
}
return 0;
}
以上代码肯定有问题。。。这种怎么避免?
解决方案1: 如果想自己实现,那么可以让内存由对象管理,对象负责内存引用计数的增加和减小。
template
class CRefCs : public T
{
public:
CRefCs()
:m_cRef(0)
{
}
virtual ~CRefCs()
{
}
public:
inline static ULONG ourmax( const ULONG & a, const ULONG & b )
{
return a > b ? a : b;
}
ULONG AddRef()
{
LONG lRef = InterlockedIncrement( &m_cRef );
_ASSERTE(lRef > 0);
return ourmax(ULONG(m_cRef), 1ul);
}
ULONG Release()
{
LONG lRef = InterlockedDecrement( &m_cRef );
//_ASSERTE(lRef >= 0);
if (lRef == 0)
{
m_cRef++;
delete this;
return ULONG(0);
} else
{
return ourmax(ULONG(m_cRef), 1ul);
}
}
#if (_MSC_VER > 1310)
volatile LONG m_cRef;
#else
LONG m_cRef;
#endif
};
解决方案2:
很好避免啊,引用计数
count 为 0 才真的 free 。
解决方案3:
用个全局的不就ok了? 或者直接先申请一段内存来放指针。
解决方案4: 这个是没办法避免的,只能靠程序员自己控制了!
另外回复楼上的,研究这个问题绝对不是浪费时间,在开发过程中遇到很正常,记得当年找bug时就碰到莫名其妙的挂掉问题,然后花很长时间才发现是内存重复释放
解决方案5:像版主说的, 这个只能靠程序员自己保证. 自己的程序自己心里要清楚应该在哪里释放, 如果是提供的接口,分配了内存给其它人使用, 则需要再提供一个释放的接口, 这样你自己也比较容易控制这种情况的发生.
赞同
解决方案6: 初始化时候,赋值为null,
new成功之后,不再为null,
delete之前先检查是否是null,
delete之后,赋值为null。
解决方案7: 都什么年代了,这问题还有疑惑么?
unique_ptr
解决方案8:int *ptr2 = ptr;//太危险了,这样操作是在考验程序猿记忆力啊
if(ptr)
{
free(ptr);
ptr = ptr2 = NULL;
printf("delete one");
}
if(ptr2)
{
free(ptr2);
ptr = ptr2 = NULL;
printf("delete two");
}
解决方案9: 不是malloc的指针都可以直接指成NULL
只有做了malloc的指针必须执行free
解决方案10:这就是为什么shared_ptr会有refcount这个概念。
支持
解决方案11: 1:你未必会遇到这种问题。
2:这种问题很容易被内存检查器发现。
3:你可以用引用计数来解决。
解决方案12:
比如以下代码
#include
#include
int main()
{
int *ptr = malloc(10*sizeof(int));
int *ptr2 = ptr;
if(ptr)
{
free(ptr);
ptr =NULL;
printf("delete one");
}
if(ptr2)
{
free(ptr2);
ptr2=NULL;
printf("delete two");
}
return 0;
}
以上代码肯定有问题。。。这种怎么避免?
谁用谁释放,非要自己弄个1对多的平级关系,错了怪谁
这个回复我喜欢,比其它楼的回复都要好,其它人说的再多再精彩本质上都是一砣翔
解决方案13: 一个地方申请,一个地方释放,这逻辑多简单啊,程序本身就该这样写,写程序-----智能的灵活的永远比不过简单的清析的!!!
想搞智能又灵活的都是最后自己给自己下套儿,而且引入一堆隐患和问题
解决方案14: type *p = malloc(...);
type *q = p;
free(p); p=NULL;
if(q!=NULL) {
free(q);
q = NULL;
}
这种方式根本就避免不了 double free!
解决方案15: 这个真只有自己注意了 智能指针也是个好办法
解决方案16:
这问题一般学生时代 每天能问出来五六个类似的 后来发现我真是浪费时间
透过问题看本质。。。
你是高人,如果简单就无视吧,不要在这里炫耀,你是版主怎么样呢?你是大牛怎么样呢?莫装逼,装逼遭雷劈。
。。我是在多个系统异步状态机会遇到的问题。。。然后简单的随手写的一个东西来讨论。。。。
最后问你一个问题,你这版主怎么当上的。。。这csdn算是完蛋了。
看本质就是在c++里面一般选择用对象管理资源,要不自己构建对象管理handle,要不使用别人写好的类库,或者使用智能指针。c语言中就办法少了一点,你说出你的需求,然后我给你解决方案。我推荐大部分的学生都不要针对某些奇思淫巧进行拓展,这真的是对时间的浪费,学生时间非常宝贵。
我只是阐述一个事实,这种事情本来就是无意义的,我的初衷就是你写了什么代码之后产生了某些联系,然后想到的这个问题,我也可以告诉你去使用智能指针来代替,但是这种类似的提问,在这里几乎天天可见,所以我认为我可以去引导一些学生,让他们可以知道什么东西是重要的,什么是不重要的,我只是这个目的。
对于您对csdn的版主审核制度,你可以去系统管理员处举报或者提出更好的建议。
另外我有没有炫耀,另外你可以去考量一下佛印和苏东坡的故事。
解决方案17: 这问题一般学生时代 每天能问出来五六个类似的 后来发现我真是浪费时间
解决方案18:都什么年代了,这问题还有疑惑么?
unique_ptr
大哥,看清楚,楼主写的可是C代码!!!
解决方案19: 怎么避免两个不同用途的指针指向同一个地址导致释放这两个指针所指对象时发生多次释放问题?
解决方案20:
if(ptr)?既然是C不是C++,请用if(ptr == NULL)。
另外,多此一举。free掉一个空指针no-op。最多free完=NULL。
请教下为什么C的指针判空用NULL更好?
if转换成整数比较,用来判断非空指针在逻辑上就是错的。
C不保证空指针和整数0的存储一致表示,因此不保证if(ptr)的指针非空。尽管这样的实现并不常见,但的确存在。
对于C++,if(ptr)中ptr直接contextually convert to bool,使用标准转换boolean conversion,当且仅当空时false,因此这是安全且一般推荐的做法。== NULL在C++中是多余的。
解决方案21: 只有相信自己!
比如以下代码
#include
#include
int main()
{
int *ptr = malloc(10*sizeof(int));
int *ptr2 = ptr;
if(ptr)
{
free(ptr);
ptr =NULL;
printf("delete one");
}
if(ptr2)
{
free(ptr2);
ptr2=NULL;
printf("delete two");
}
return 0;
}
以上代码肯定有问题。。。这种怎么避免?
解决方案22: 避免?为何要避免,你一个指针使用,一个指针分配释放就行了
如果所有的陷阱,或者所有会出错的地方,都非要避免不可。
那就不是C语言了
事情做正确,除了机制以外,还有协议,约定 可以用来避免出错。
如果非要避免。
那就用C++把指针封装死,不给用,不暴露HANDLE,那就不会出错了。
C 语言,就直接不允许,使用第二个指针就可以了。
比如 把需要分配内存的一系列算法,做成函数,只能这么用,其他一切都认为是错误的。
解决方案23: 这样是没法避免的,只有从根本上避免同时指向同一处,如果指向了同一处那就只释放一个(总之就是只有靠自己了)
解决方案24: 1 每次释放时判空,不成立则释放,释放后置空
2 智能指针
解决方案25: 静态分析工具splint对LZ程序(假设其文件名为two_pointers.c)报以下信息:
E:\two_pointers.c(16,6):
Variable ptr2 used after being released
E:\two_pointers.c(11,11): Storage ptr2 released
以上信息指出ptr2指向的存储在第11行被释放了,但第16行还在使用ptr2.
解决方案26: 没有百分百避免这类问题的方法,越安全的东西自由度越小,绝对安全的东西根本不需要程序员
尽可能遵守谁申请谁释放的原则,或者使用智能指针不进行手动释放,可以在一定程度上减少这类问题出现的几率
以上介绍了“ 怎么避免两个指向同一个地址的多次释放问题”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2582409.html