C++ 如果已知void*分配大小,如何将确切的内存大小传递给free()
据我所知;在C++和C<代码> Debug < /COD>运算符或<代码> For()中,代码>函数可以从Positer数据类型知道分配内存的大小,并且<代码> Dele> <代码>可以自动调用析构函数。 如果分配的指针是使用一种在其机制中不使用新运算符的单例静态动态数组注册的(即仅限C++ 如果已知void*分配大小,如何将确切的内存大小传递给free(),c++,c,pointers,memory-management,C++,C,Pointers,Memory Management,据我所知;在C++和C Debug < /COD>运算符或 For()中,代码>函数可以从Positer数据类型知道分配内存的大小,并且 Dele> 可以自动调用析构函数。 如果分配的指针是使用一种在其机制中不使用新运算符的单例静态动态数组注册的(即仅限malloc) 在加载的新指针中。此数组寄存器void*指针,并从重载的new运算符中获取该指针的大小 前 因此,我的问题是如何使用有关大小的信息来释放我忘记使用此数组的析构函数删除的确切分配内存 前 Dynamic_数组::~Dynamic_数
malloc
)
在加载的新指针中。此数组寄存器void*
指针,并从重载的new运算符中获取该指针的大小
前
因此,我的问题是如何使用有关大小的信息来释放我忘记使用此数组的析构函数删除的确切分配内存
前
Dynamic_数组::~Dynamic_数组(){
int指数=0;
while(index
多谢各位
据我所知;在C++和C中,删除运算符或For()函数可以从PoCTER数据类型知道分配内存的大小。
否。delete操作符调用free()函数;free()函数从与指针相关联的元数据中知道大小,例如内存前一个字中的长度字
delete可以自动调用析构函数
对
我的问题是如何使用有关大小的信息释放我忘记使用此数组的析构函数删除的确切分配内存
你不需要知道。见上文
据我所知;在C++和C中,删除运算符或For()函数可以从PoCTER数据类型知道分配内存的大小。
否。delete操作符调用free()函数;free()函数从与指针相关联的元数据中知道大小,例如内存前一个字中的长度字
delete可以自动调用析构函数
对
我的问题是如何使用有关大小的信息释放我忘记使用此数组的析构函数删除的确切分配内存
你不需要知道。见上文。在C中
free()函数使用堆中围绕已分配内存的数据结构
该数据结构包括所分配内存的实际起始地址、堆中前一个内存块的地址以及堆中下一个内存块的地址
通常,堆实际上是两个链表
一个是分配内存,一个是空闲内存
malloc操作从空闲链表中获取一个大小合适的块,并将其放入分配的内存链表中。
这可能涉及将一个较大的空闲内存块分成两个较小的内存块,其中一个内存块被移动到分配的内存链表,指针在新块的空闲内存列表中被调整
空闲从已分配内存链表中删除该条目,并将其放入空闲链表中
然后,如果空闲链表包含两个相邻的内存块,则这两个内存块组合成一个/更大的内存块
有几种算法可以用来准确地确定哪个空闲区域被分解/移动到分配的内存列表中。在C中
free()函数使用堆中围绕已分配内存的数据结构
该数据结构包括所分配内存的实际起始地址、堆中前一个内存块的地址以及堆中下一个内存块的地址
通常,堆实际上是两个链表
一个是分配内存,一个是空闲内存
malloc操作从空闲链表中获取一个大小合适的块,并将其放入分配的内存链表中。
这可能涉及将一个较大的空闲内存块分成两个较小的内存块,其中一个内存块被移动到分配的内存链表,指针在新块的空闲内存列表中被调整
空闲从已分配内存链表中删除该条目,并将其放入空闲链表中
然后,如果空闲链表包含两个相邻的内存块,则这两个内存块组合成一个/更大的内存块
有几种算法可用于准确确定将哪个空闲区域拆分/移动到已分配内存列表。您不需要知道其大小。如果使用malloc分配,则可以使用free释放。内存管理器知道它分配的块有多大。但是如果我说free(void*),free确实知道分配内存的大小吗?如果我通过C++对象* PotoTe通过VC++抛出*如何调用DELASE(VULL *),因为它会给出删除未知类型(Value*)的警告“我是指如何给数组的POTION的所有权,不能调用<代码>删除(无效*)。< /代码>它不存在。你不需要。您可以调用free()。
No。。他不能使用free,因为free没有调用析构函数,所以它可能会泄漏。他正在将类指针投射到一个void*
,并想知道如何删除该内存地址处分配的类。您不需要知道大小。如果使用malloc分配,则可以使用free释放。内存管理器知道它分配的块有多大。但是如果我说free(void*),free确实知道分配内存的大小吗?如果我通过C++传递对象*PotoTe来空出*,我怎么调用Dele[Value](因为它会给出DelETI的警告)
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 ++;
}
}