C++ 如何确定c++;运行时的对象

C++ 如何确定c++;运行时的对象,c++,memory,memory-management,runtime,C++,Memory,Memory Management,Runtime,我试图在运行时确定对象的大小。sizeof不起作用,因为它在编译时返回大小。以下是我的意思的一个例子: class Foo { public: Foo() { c = new char[1024*1024*1024]; } ~Foo() { delete[] c; } private: char *c; }; 在这种情况下,sizeof(Foo)将是4个字节,而不是~1GB。如何在运行时确定Fo

我试图在运行时确定对象的大小。sizeof不起作用,因为它在编译时返回大小。以下是我的意思的一个例子:

class Foo 
{
public:
    Foo() 
    {
        c = new char[1024*1024*1024];
    }
    ~Foo() 
    { 
        delete[] c; 
    }

private:
    char *c;
};

在这种情况下,
sizeof(Foo)
将是4个字节,而不是~1GB。如何在运行时确定Foo的大小?提前谢谢。

你需要自己记录一下。例如:

struct Foo 
{
    Foo()
        : elements(1024 * 1024 * 1024) 
    {
        c.reset(new char[elements]);
    }

    boost::scoped_array<char> c;
    int elements;
};
structfoo
{
Foo()
:元素(1024*1024*1024)
{
c、 重置(新字符[元素]);
}
boost::作用域数组c;
int元素;
};

请注意,您应该使用智能指针容器来管理动态分配的对象,这样您就不必手动管理它们的生命周期。在这里,我演示了
作用域数组的使用,它是一个非常有用的容器。您还可以使用
shared\u array
或将
shared\u ptr
与自定义删除器一起使用。

Foo的大小是恒定的。从技术上讲,~1GB的字符不属于该对象,只是指向该对象的指针才属于该对象。这些字符只被称为对象所有,因为对象负责为它们分配和释放内存。C++不提供允许你找出一个对象分配了多少内存的特性。您必须自己跟踪它。

在您的系统上,对象的大小是4字节。但是,对象会使用额外的资源,例如1GB内存。

可能的重复。您可能需要区分对象的大小和对象控制的内存量。将
c
设置为指向的分配永远不会是对象本身的一部分。类
Foo
的对象都将具有相同的大小(即上面示例中数据指针的大小)。这有点迂腐,但是…
sizeof不起作用,因为它在编译时返回大小。
-实际上不起作用。有时会出现运行时sizeofs,尤其是在C99和GCC中。()可能重复@Dr.Jay,offtopic,但我想知道如果您尝试运行以下代码,是否知道会发生什么:Foo a;Foo b=a;这是一个很好的答案。但是,我正在尝试确定我自己没有编写的对象的内存使用情况。具体来说,stl字符串、stl wstring和ICU UnicodeString都使用相同的数据填充。每个函数都返回内部缓冲区的大小,但不返回整个对象的大小。使问题复杂化的是,这些对象可能包含指向其他数据的指针。有什么想法吗?@Jay博士:你可以估计,但这差不多是你能做的最好的了。对于
std::string
std::wstring
,您可以获取
s.size()
以查找它们拥有的缓冲区的大小(注意,缓冲区是以字符为单位的,因此您必须将
wstring
的结果乘以
sizeof(wchar\u t)
以获得字节为单位的大小),并将其添加到对象的大小
sizeof(s)
。对于其他类型,您必须找到它们是否公开了它们所包含内容的大小。无论如何,这只是一个估计,因为基础缓冲区可能更大(例如,对于
向量
v.capacity()
可能大于
v.size()
)。