int* Array;
Array = new int[10];
delete[] Array;
delete
知道已分配内存的数量。我用Google搜索它将它存储在内存中,但它依赖于编译器。无论如何使用得到这个计数?
答案 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::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跟踪为你分配的大小。