内存中的确切位置是删除使用的已分配内存的数量?

时间:2011-06-04 22:15:16

标签: c++ memory new-operator allocation delete-operator

int* Array;

Array = new int[10];

delete[] Array;

delete知道已分配内存的数量。我用Google搜索它将它存储在内存中,但它依赖于编译器。无论如何使用得到这个计数?

7 个答案:

答案 0 :(得分:4)

实际上,堆知道每个分配的大小。但是,这不是您可以轻松访问的内容,并且只能保证大于或等于请求的数量。有时为了字节对齐的利益分配了更多。

正如Ben所说,实现确实知道在某些情况下数组中有多少个对象,以便可以调用它们的析构函数。

答案 1 :(得分:2)

没有标准的方法来检索构造后的元素数量。实际上,对于int数组,它可能不存储在任何地方。只有具有非平凡析构函数的元素数组才需要计数,因此delete[]可以调用正确数量的析构函数。在您的示例中,没有任何析构函数调用,因为int没有析构函数。

答案 2 :(得分:2)

分配后,无法获得动态分配数组的元素数。


统治所有人的一种方式

但是,您可以预先存储它:

int* Array;
size_t len = 10;
Array = new int[len];
delete[] Array;

自定义class

如果您不喜欢,可以创建自己的class

class IntArray
{
public:
    int* data;
    size_t length;
    IntArray(size_t);
    ~IntArray();
};

IntArray::IntArray(size_t len)
{
    length = len;
    data = new int[len];
}

IntArray::~IntArray()
{
    length = 0;
    delete data;
    data = NULL;
}

的std ::矢量

我建议的方法是使用std::vector

std::vector<int> Array (10, 0);

您可以像使用常规数组一样使用它...具有额外功能:

for(size_t i = 0; i < Array.size(); ++i)
    Array[i] = i;

答案 3 :(得分:1)

谁说实际上有一个?

这些东西取决于实施,因此对您,我或任何想要了解它的人都无趣。

答案 4 :(得分:1)

C ++通常故意不允许您访问该信息,因为数组是简单类型,不会保留与它们相关的信息。最终必须存储信息,但编译器可以自由地确定C ++标准的方式,地点和时间,以便在程序集中进行优化。

基本上,要么自己存储在某个地方,要么(更好,大部分时间),使用std::vector

答案 5 :(得分:1)

这种分配中可能有一两个元素的数量,具体取决于您使用的类型和实现,但您无法以您可能想要的方式真正访问它们。

第一个是您正在使用的实际内存管理器(提供malloc的库)存储的记帐信息。它将存储已在系统的空闲存储中分配了一些大小的记录(例如,使用glibc malloc可以进行堆或匿名内存分配)。这个空间至少与您尝试存储的数据一样大(sizeof(int)* count + delta,其中delta是我在下面讨论的C ++编译器的跟踪信息),但它也可能更大,甚至更大。

第二个计数是编译器保存的值,它告诉它如何在数组中的所有元素上调用析构函数(RAII的整个魔法),但是该值无法访问,甚至可能无需直接存储信息虽然不太可能。

正如其他人所说,如果你需要跟踪分配大小的信息,你可能想要使用一个向量,你甚至可以将它作为一个实际数组用于指针数学,如果需要的话(参见http://www.cplusplus.com/reference/stl/vector/有关此内容的更多信息)。

答案 6 :(得分:0)

不,如果您需要了解,您需要自己跟踪它。

许多人喜欢使用std :: vector,如果它不是固定大小的话。 std :: vector跟踪为你分配的大小。