为什么不删除我的指针删除我的指针?

因此,要理解新/删除更好的(真正证明自己与小例子为什么需要对接口虚析构函数),我想明白了内存泄漏,使我生活在恐惧他们。 但我有一个很难让我对泄漏,可以这么说; 其实,我也很难有新的/删除了。

这里是我的简单的版本:

int* P1 = new int(43); cout<<"P1 = "<<P1<<endl; cout<<"*P1 = "<<*P1<<endl; delete P1; cout<<"P1 = "<<P1<<endl; cout<<"*P1 = "<<*P1<<endl;

该打印:

P1 = 0xcc0340 *P1 = 43 P1 = 0xcc0340 *P1 = 43

我有一些东西在类中更复杂,但这个例子说明我的失败。 我想删除需要一个指针,并释放它的内存,从而无效指针或者至少是它指向? 我必须做一些非常简单非常错误的。

--------------解决方案-------------

您正在造成不确定的行为 。 这意味着,任何事情都有可能发生。 由于事情确实发生了,一切都表现为记录。 (有时“东西”看起来非常相似,其他什么东西,你可能会错误地期待。做什么,你认为你是想实现的是“不确定的行为”可能允许的实例之一。)

还要注意的是一个“内存泄漏”是那种你想要做什么的对面 - 内存泄漏你忘了释放内存,而你已经释放的内存,现在访问无效的内存。

这里是一个真正的内存泄漏,这也不会导致不确定的行为-不要混淆“不错,但正确”与“不正确”节目!

int * factorial(int * n)
{
if (*n == 0) return new int(1);
else return new int(*n * *factorial(*n - 1));
}

我必须做一些非常简单非常错误的。

你是绝对正确的。 你的代码做一些很简单很错,你已经付出了最大的代价- 没有看到任何消极结果 。 有时候,你做的事情错了,并没有什么不好的事情发生。 这是最糟糕的可能结果,因为你可能不知道你的代码是错误的,你会继续使用它,直到有一天,你的代码意外打破,你会不知道在哪里或如何,因为它总是工作过。 它会打破某处完全不相干到这是错误的实际的一部分,你会花几个小时试图追查并找出为什么它打破。

当你做的事情错了,这是不确定的行为。 这意味着,任何事情都有可能发生。 在最好的情况,你的代码崩溃和设计缺陷和闪烁的灯光来在说:“你使用释放的内存”,一切都非常清楚。 在最坏的情况,恶魔飞出你的鼻子。 但是,仅仅上面,第二个最坏可能的结果是,一切都显示为您意欲它工作。

这将是一个内存泄漏:

int* P1 = new int(43);
P1 = new int(42);

分配内存,而无需再次将其删除。

// Reserve some memory for an int and set that memory to the value 43.
int* P1 = new int(43);

// Print the address of the reserved memory.
cout<<"P1 = "<<P1<<endl;
// Print the contents of that memory.
cout<<"*P1 = "<<*P1<<endl;

// Free the memory - it is no longer reserved to you.
delete P1;

// int* P2 = new int(47);

// Print the address of the memory. It still holds the address to
// the memory that used to be reserved for you.
cout<<"P1 = "<<P1<<endl;

// Print the current value of the memory that used to be reserved.
cout<<"*P1 = "<<*P1<<endl;

您是否取消对P2的线,就很有可能将被分配这将改变在最后一行打印的值相同的存储器。

访问已经被释放的内存与delete的原因未定义的行为正如其他人指出。 未定义包括只在满月也许在某些情况下,一种奇特的方式(崩溃?;-)。 它还包括一切工作得很好,现在,但错误是当你在你的程序再进行一项改变其他任何地方可以跳开了地雷。

内存韭菜是当你与分配内存new从不与释放它delete 。 这通常不会注意到,直到有人运行程序较长时间,并发现它吃了系统的所有内存。

此代码

delete P1;

cout<<"P1 = "<<P1<<endl;
cout<<"*P1 = "<<*P1<<endl;

导致不确定的行为。 所以,任何事情都有可能发生。 这更容易导致内存泄漏:

for(;;) new int;

解引用删除的指针是不确定的行为,如已经解释,即你正在做的事情是错误的。 编译器可以帮助你通过改变指针的值来一些魔法值,总会引起取消引用指针失败,并且可以给你一个线索,这是因为它先前已被删除发现的错误。

快速测试显示,以下行为对我来说:
MSVC2010:
调试版本:* P1 = 0xfeeefeee
发行版:* P1 = <随机>
GCC 4.6:
调试和发布版本:* P1 = 0

所以,你只是(联合国)幸运的,你又得到了原始值。 我建议你​​总是建立在调试模式来测试你的程序(即使你不进行调试),因为它增加了额外的完整性检查你的代码。

释放内存但不清洗。 该值可能留在内存中直到某些其它过程在该位置写入新的值。

删除指针不失效。 它释放它指向回堆内存。 在这种情况下,存储器没​​有被重复使用,因此,仍包含相同的内容。 在某些时候,该内存将被重用,那么你得到的未定义行为,其他人发言。

这不是一个内存泄漏虽然。 当你点指向另一个内存分配(或只是丢弃指针)不释放其指向的内存。 第一则保持分配的,因为您对它的引用,你没有释放它的方式。

分类:C# 时间:2012-01-01 人气:0
分享到:

相关文章

  • 点击的UISearchBar导致内存泄漏 2012-01-03

    我一直得到一个奇怪的内存泄漏,我只是明确指出是什么原因造成. 我使用的是有一个主要的观点和反面观点一个实用程序. 当你的另一面视图您可以通过点击加号按钮,提供了另一种模式的看法. 这种观点具有的UISearchBar和UITableView的. 当上点击的UISearchBar内存泄漏产生以下信息: 为什么点击这个酒吧产生? 任何帮助将不胜感激. --------------解决方案------------- 我看到同样的泄漏使用NSXMLParser的时候,我已经批准了相同的行为多个应用程序,

  • 避免内存泄漏,而突变C字符串 2012-01-04

    为教育目的,我使用的一些测试程序C字符串. 我想缩短与一个占位符,如字符串"...". 也就是说"Quite a long string"将成为"Quite a lo..."如果我的最大长度设置为13.此外,我不想破坏原有的字符串-因此缩短字符串必须是一个副本. (静态)以下方法是我想出. 我的问题是: 如果类为我缩短字符串分配内存还负责释放它我现在做的是存储在返回字符串中一个单独的"用户类"和推迟释放内存给该用户类? con

  • NSKeyedUnarchiver内存泄漏 2012-01-04

    我有这样的代码从文件加载一组属性,然后分配给它. NSMutableData* data = [NSData dataWithContentsOfFile:fullPath]; NSKeyedUnarchiver* unarc = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; NSMutableArray* loadedLibraries = [unarc decodeObjectForKey:@"libraries"

  • 在NSData的类别潜在的内存泄漏 2012-01-05

    当使用Xcode分析我得到一个消息说: 对象的潜在泄漏分配 代码这是我NSData(String)类,代码为: - (NSString*) utf8String { return [[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding]; } 现在我该怎么解决这个问题? 当我改变语句: - (NSString*) utf8String { return [[[NSString alloc] initWithData:se

  • ffmpeg的(libavcodec的)。 在avcodec_encode_video内存泄漏 2012-01-05

    我想转码的视频使用libavcodec的帮助. 在转码大的视频文件(小时或更长时间)我得到了巨大的avcodec_encode_video内存泄漏. 我试图调试它,但使用不同的视频文件,不同的功能产生泄漏,我有一点点困惑了:). 这里FFMPEG与QT内存泄漏的是,我有同样的问题,但我不知道这样做,人怎么解决这个问题. QtFFmpegwrapper似乎做同样的我做(或我错过了什么). 我的方法是低级. 我把关心和AFRAME与aPacket和av_free外av_free_packet. in

  • 在jQuery UI的内存泄漏 2012-01-05

    我有一个简单的页面,它由三个jQuery UI的progressbars表和Ajax调用. Ajax调用了一个空的PHP文件,并成功摧毁我并重新创建我的progressbars. 它看似简单,但运行它引起两个IE7和Chrome的内存泄漏(虽然Chrome浏览器处理得更加优雅). 这里是我的代码: <script type="text/javascript" src="jQuery/js/jquery-1.3.1.js"></script>

  • 如何识别Android的内存泄漏? 2012-01-05

    我已经开发了一个简单的应用程序测试它之前,我要检查任何内存泄漏是否有应用程序. 我不知道如何识别Android中的泄漏. 我使用的Eclipse IDE进行开发. 是否有一个很好的介绍到发现内存泄漏的Andr​​oid地方应用程序? --------------解决方案------------- MAT的Eclipse插件,只要安装它,然后点击在Eclipse"转储HPROF"按钮. http://www.eclipse.org/mat/ http://kohlerm.blogspot

  • 仪器:创建的UIButton时内存泄漏 2012-01-06

    我想,为什么在创建界面生成器的时候的UIButton找出 - 由运行Xcode中的仪器应用程序时发生内存泄漏. 这是我创建的内存泄漏. 我打开了一个新的应用,开辟了在Interface Builder中myAppViewController.xib文件. 我改变了背景为黑色. 添加一个UIButton,它更名为"foo"的称号. 保存并退出. 在myAppViewController.h文件我有以下 #import <UIKit/UIKit.h> @interface mi

  • 内存泄漏 - 没有一个垃圾收集器 2012-01-07

    让我们想到了内存泄漏程序,其中堆内存块不释放,程序终止的. 如果这是(说)的Java程序中,内置的垃圾收集器会在程序退出之前已经自动释放这堆块. 但是,即使在C ++中,如果程序退出时,不会内核自动取消分配与进程相关联的所有空间. 此外,在Java代码,内核将必须解除分配的过程(即使堆栈和堆的部件由垃圾收集器释放)的文本部分(代码)的空间. 所以是使用垃圾收集功能的整体优势 - 只是在时间增加储蓄需要解除分配由程序本身,而不是在内核堆? (如果有任何此类储蓄) 编辑:我的一个主要疑问也随之诞生看

  • 工具来检查Android的内存泄漏 2012-01-07

    有没有很好的工具来检查内存泄漏的Andr​​oid? 任何帮助会感激. --------------解决方案------------- 工具"Traceview"也会对您有所帮助. 这个自带的Andr​​oid SDK中. 参见更多细节下面的链接. http://developer.android.com/guide/developing/tool​​s/traceview.html 您可以尝试使用内存分析器来检查Android的内存泄漏 http://kohlerm.blogspot

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.861 (s). 10 q(s)