【问题标题】:Handling memory allocation by myself in xcode (c++)在 xcode (c++) 中自己处理内存分配
【发布时间】:2012-05-17 19:41:29
【问题描述】:

我在我的 Xcode 4.3.2 中关闭了自动引用计数 (ARC),并认为我掌握得很好。然后我写了这个小程序:

int main()
{
    int *a = new int(3);
    delete a;
    printf("%i",*a);
    return 0;
}

这是打印 3,但它应该打印垃圾。看起来编译器会处理我所有的内存分配,我不希望它这样做。我该怎么做才能删除它?

【问题讨论】:

  • 您正在打印的是未定义的行为,但它恰好是 3,因为很可能内存在第 2 行和第 3 行之间没有被修改
  • 它也恰好是我选择的任何东西。在另一个编译器(p.e codepad)中,它是垃圾。应该是这样的..
  • 是的,它正在打印垃圾。垃圾恰好随机是3。人类的问题是大多数人不了解真正的随机性。dilbert.com/strips/comic/2001-10-25
  • 调试版和发布版都会出现这种情况吗?
  • 未定义的行为并不意味着你一定会得到垃圾。未定义意味着任何事情都可能发生,打印出 '3' 是完全符合的行为。这个程序可以合法地做的其他事情:开始随机播放你的音乐库中的音乐,让你的显示器起火,给你所有的朋友发电子邮件,讨厌邮件似乎来自你。

标签: c++ xcode memory automatic-ref-counting allocation


【解决方案1】:

你用 new 给你的程序一个堆上的地址。它恰好是该地址处值为 3 的整数。 当您使用 delete 释放该堆区域时,它不会立即设置为某个垃圾值,它仍然包含 3。 您的 print 语句转到地址 a 并尝试打印那里的整数,它找到 3 并打印它。

如果在 xcode 中可行,您可以尝试添加编译器警告,我知道 gcc 和其他命令行编译器提供此功能,以避免在程序对您大喊大叫的情况下发生这些令人困惑的未定义行为。

【讨论】:

  • 谢谢,我去找找。在我的其他机器上(不是 mac,ergo 不是 Xcode),它总是显示垃圾,让人困惑......
  • stackoverflow.com/questions/1996108/… 这些标志应该有帮助。
  • 如果您使用mmapmunmap.. 也可以取消映射该内存。然后操作系统将发送一个SIGSEGV 信号。
  • @Vlad 不是在映射一个与手头问题无关的完全不同的概念吗?
  • @MahmoudAl-Qudsi:不,不是,很多情况下使用 malloc/free 是不够的,所以人们使用 mmap、splice 和其他东西。这都是内存管理。然而,Munmap 取消映射虚拟内存(真正释放它),而这确实“释放”了。
猜你喜欢
  • 1970-01-01
  • 2013-09-18
  • 2015-05-29
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
相关资源
最近更新 更多