【发布时间】:2015-03-09 02:02:50
【问题描述】:
据我所知;在c++和c中delete操作符或free()函数可以通过pionter数据类型知道分配内存的大小,delete可以自动调用析构函数。
如果分配的指针是使用一种在其机制中不使用新运算符的单例静态动态数组注册的(即仅malloc)
在超载的新指针中。此数组注册void* 指针并从重载的new operator 中获取该指针的大小
例如。
void * operator new (size_t sz) {
void * m = malloc (sz);
Dynamic_Array::get_instance()->add(m,sz) ; //registering pointer
return m ;
}
所以我的问题是如何使用有关大小的信息来释放我忘记使用该数组的析构函数删除的确切分配的内存。
例如
Dynamic_Array::~Dynamic_Array() {
int index = 0;
while(index < storage_size) //storage_size: total number of pointers in array
/* storage is void** array which register
allocated pointers as void* and use classic memset and memcpy to enlarge*/
{
if (storage[index] != NULL) printf("Pointer : %d was not deleted\n", storage[index]);
//how to use delete or free here to delete void* pointer but with known size of memory
index ++;
}
}
谢谢。
【问题讨论】:
-
你不需要知道大小。如果它是使用 malloc 分配的,则可以使用 free 释放它。内存管理器知道它分配的块有多大。
-
但是如果我说 free(void*) free 是否确切地知道分配内存的大小?如果我通过强制转换将 C++ 对象 * 指针传递给 void * 我怎么能调用 delete (void*) “因为它会发出删除未知类型 (void*) 的警告”
-
我的意思是如何赋予数组该指针的所有权
-
你不能调用
delete(void*).它不存在。你不需要。你打电话给free(). -
不..他不能使用 free 因为它可能会泄漏,因为 free 不会调用析构函数。他将他的类指针转换为
void*,并想知道如何删除在该内存地址分配的类。
标签: c++ c pointers memory-management