获取对象void *的大小指向

时间:2012-07-22 05:33:38

标签: c++ sizeof void-pointers

#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指向的大小,以便它可以删除它所以它必须存放在某些地方。

3 个答案:

答案 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或对象的大小。