- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
所以我用 malloc()
分配了一 block 内存,后来用 realloc()
进行了更改。
在我的代码中的某个时刻,我想清空它,我的意思是本质上给它的内存为 0。这可以直观地使用 realloc(pointer,0)
完成。我在这里读到这是实现定义的,不应使用。
我应该改用 free()
,然后再做一个 malloc()
?
最佳答案
这取决于你的意思:如果你想清空已使用的内存,但仍然可以访问该内存,那么你使用 memset(pointer, 0, mem_size);
,将所述内存重新初始化为零。
如果您不再需要该内存,则只需调用 free(pointer);
,这将释放内存,以便在其他地方使用。
在您的系统上使用 realloc(pointer, 0)
可能像 free
一样工作,但这是不是标准行为。 realloc(ptr, 0)
没有被 C99 或 C11 标准指定为等同于 free(ptr)
。
realloc(pointer, 0)
不等同于 free(pointer)
。标准(C99,§7.22.3.5):
The realloc functionSynopsis1#include <stdlib.h>void *realloc(void *ptr, size_t size);Description2 The realloc function deallocates the old object pointed to by ptr and returns apointer to a new object that has the size specified by size. The contents of the newobject shall be the same as that of the old object prior to deallocation, up to the lesser ofthe new and old sizes. Any bytes in the new object beyond the size of the old object haveindeterminate values.3 If ptr is a null pointer, the realloc function behaves like the malloc function for thespecified size. Otherwise, if ptr does not match a pointer earlier returned by a memorymanagement function, or if the space has been deallocated by a call to the free orrealloc function, the behavior is undefined. If memory for the new object cannot beallocated, the old object is not deallocated and its value is unchanged.Returns4The realloc function returns a pointer to the new object (which may have the samevalue as a pointer to the old object), or a null pointer if the new object could not beallocated.
如您所见,它没有为大小为 0 的 realloc 调用指定特殊情况。相反,它只声明在分配内存失败时返回 NULL 指针,在所有其他情况下返回指针。指向 0 字节的指针将是一个可行的选择。
引用 a related question :
More intuitively, realloc is "conceptually equivalent" to to malloc+memcpy+free on the other pointer, and malloc-ing a 0-byte chunk of memory returns either NULL either a unique pointer, not to be used for storing anything (you asked for 0 bytes), but still to be freeed. So, no, don't use realloc like that, it may work on some implementations (namely, Linux) but it's certainly not guaranteed.
作为该链接问题的另一个答案,realloc(ptr, 0)
的行为被明确定义为 implementation defined 根据当前 C11 标准:
If the size of the space requested is zero, the behavior is implementation-defined: either a null pointer is returned, or the behavior is as if the size were some nonzero value, except that the returned pointer shall not be used to access an object
关于c - 释放分配的内存 : realloc() vs. free(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21672912/
我有一个附加了 View Controller 的 AVAudioPlayer 实例。 @property (nonatomic, retain) AVAudioPlayer *previewAudi
我是java初学者。假设我声明了一个 Account 类型的变量 Account _account = new Account("Thomas"); 然后在其他地方我做了这样的事情: _account
我在我的应用程序中使用了 3 个 UIViewController,现在我想知道当我从另一个应用程序切换到另一个 UIViewController 时释放它们是否是一个好主意。显然,这将是隐藏的,当它
我分配了一个直接缓冲区: ByteBuffer directBuffer = ByteBuffer.allocateDirect(1024); 我读过: Deallocating Direct Buf
场景。我有一个图表,我可以使用右键单击来执行平移。这非常有效。然后我完美地添加了右键菜单。 问题。现在,即使在拖动操作完成后释放鼠标,也会显示右键菜单。 有没有办法在 Java Swing 或 Jav
我使用此代码获取 ABPerson 的姓氏 CFStringRef lastNameRef = ABRecordCopyValue((ABRecordRef)personRecordRef, kABP
目前,我们在基于 C 的嵌入式应用程序中使用 malloc/free Linux 命令进行内存分配/取消分配。我听说这会导致内存碎片,因为内存分配/取消分配会导致堆大小增加/减少,从而导致性能下降。其
当我尝试释放缓冲区时遇到问题。每次我尝试将缓冲区传递给释放方法时,都会发生段错误。 Valgrind 确认段错误位于 BufferDeallocate 方法中。 ==30960== Memcheck,
我想知道何时按下或释放修改后的键(Ctrl 或 Shift)。 基本上,用户可以在按下修改键的情况下执行多次击键,而我不想在它被释放之前执行一个操作(想想 Emacs 和 Ctrl + X + S).
我编写了一个相当大的网络应用程序。它运行良好一段时间,然后慢慢开始运行缓慢,因为 DOM 节点开始爬升到 80,000 - 100,000 左右。 所以我一直在 Chrome 开发工具控制台 (DCT
我知道在像 c 这样的语言中,我需要在分配内存后释放它。 (我来自 Java),对此我有几个问题: 当我在做的时候: int array[30]; (即创建一个大小为 30 个整数的数组)与
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How to release pointer from boost::shared_ptr? Detach
我有一个可以从多个后台线程访问的类,可能同时访问。我无法复制该类,因为重新创建它的内容(处理或内存方面)可能很昂贵。 也有可能在后台处理仍在继续并访问该属性时替换了此类的属性。 目前我有定期的保留/释
这个问题是对: 的扩展链接-1:Creating an image out of the ios surface and saving it Link-2:Taking Screenshots fro
我有一个实例变量 NSMutableArray* searchResults。 首先,我初始化它: self.searchResults = [[NSMutableArray alloc] init]
如果我在堆上声明一些东西,比如 char *a=new char[1000] 并且主程序停止,如果没有 delete[]<,那么分配的内存会发生什么 调用?它保留在堆上还是自动释放? 最佳答案 就C+
在开发相机应用时,我遇到了一个异常,该异常仅在我切换到其他应用时发生(onPause() 用于我的应用)。 01-15 17:22:15.017: E/AndroidRuntime(14336): F
使用 JDK 1.8 编译时出现 maven 编译器错误 无法执行目标 org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (de
将 BufferedImage 保存到磁盘(以释放内存)的最快方法是什么? 我的 Java 应用程序处理大量图像(每约 300 毫秒将图像加载到内存中)。大多数这些图像都会立即被丢弃 (gc),但每隔
使用 JDK 1.8 编译时出现 maven 编译器错误 未能在项目 DUMMY 上执行目标 org.apache.maven.plugins:maven-compiler-plugin:3.8.1:
我是一名优秀的程序员,十分优秀!