#define BOOST_TEST_MODULE MemoryLeakTest
#include <boost/test/unit_test.hpp>
#include <iostream>
using namespace std;
BOOST_AUTO_TEST_CASE( MemoryLeakTest)
{
double* n1 = new double(100);
void* v1 = n1;
cout << sizeof(v1) << endl;
delete v1;
}
此代码可以正常运行,不会出现任何错误泄漏。但是我希望能够获得对象void*
的大小。我想有一种方法,因为delete语句知道对象v1指向的大小,以便它可以删除它所以它必须存放在某些地方。
答案 0 :(得分:5)
将delete
应用于C ++中的void *
指针是非法的。
如果您的编译器支持此作为非标准扩展,那么很可能delete
假定该指针指向的未知对象具有普通的析构函数。在这种情况下,除了立即将控件移交给原始内存释放函数delete
之外,::operator delete
不必执行任何操作,这可能只调用free
。 (当然,最后一点可能取决于实现)。
所以,你的问题基本归结为“如何确定malloc
- 内存块的大小”。没有标准功能可以做到这一点。在分配时自己记住大小。如果您的平台提供了任何此类功能,请使用非标准的特定于实现的库功能。
在某些实现中,这可以通过msize
函数完成。但同样,为了做到有意义,你必须首先研究你的实现。你需要弄清楚new
如何分配内存和/或delete v1
究竟是什么,因为它不是标准的C ++。
答案 1 :(得分:0)
void *
的大小将继续为sizeof
指针。如果要查找void *
指向的对象的实际大小,您应该知道实际对象并将指针强制转换为正确的类型。不,删除将不知道对象指针大小,并将导致泄漏。正确的做法,即使是delete
,也是为了确保将指针强制转换为正确的类型。
答案 2 :(得分:0)
从double *
到void *
执行转换时,您丢弃了编译器要处理的信息。
因此,编译器不知道要调用的destructos或对象的大小。