【发布时间】:2013-09-02 13:55:50
【问题描述】:
我分配了 25,000,000,000 个这些单位:
struct test
{
public:
test();
void insert(unsigned int var1, unsigned int var2, unsigned long var3);
bool isEmpty() const;
unsigned char * data;
};
test::test()
{
data = NULL;
}
bool test::isEmpty() const
{
return (data == NULL);
}
unsigned long index = 25000000000;
像这样:
test *something = new (nothrow) test[index];
if (!something)
{
cout << "Error allocating memory for [something]" << endl;
return ;
}
cout << "DONE !" << endl;
然后我什至将 made sure 其 data 初始化为 NULL。
unsigned long j=0;
while (j<index)
{
something[j].data = NULL;
j++;
}
一切都很好,除非我像这样遍历某事[]:
test *chk;
unsigned long empty = 0;
unsigned long not_empty = 0;
unsigned long i=0;
for (i=0; i< index; i++ )
{
chk = &something[i];
if (!chk->isEmpty())
{
not_empty++;
} else
empty++;
}
cout << "Empty [" << empty << "]" << endl;
cout << "Not Empty [" << not_empty << "]" << endl;
cout << "Total [" << empty + not_empty << "]" << endl;
(最后更新)
原来是硬件问题——内存。有些棍子不能与其他棍子一起正常工作。感谢大家的建议,太糟糕的硬件路径不在答案中o/
(更新)
我得到恒定数量的非 NULL (not_empty) 的初始化元素。仍然不知道为什么。 当然,empty + not_empty = index。
如果我在构造函数中注释掉data = NULL;,如果我在分配数组后立即循环遍历数组,我会得到正确的空/非空数字。但是,在强制指针指向 NULL 之后,我得到相同的常量 not_empty 值,在再次循环遍历数组之后。
我还使用 malloc() 将其重新设计为普通指针,这并没有什么区别,只是我第一次注意到指针是正确的(空的),直到我设置它们。
我用较小的 [index] 值 (5,500,000,000) 进行了一些测试,但我无法复制该行为。
我使用 google 的 ltcmalloc 和分配的内存大小表明,它使用了正确的 [index] 大小;
【问题讨论】:
-
将标签从 c 更新为 c++。
-
我用更少的元素尝试过这个(因为我只有 16GB 的 RAM),没有
ltcmalloc。它工作正常。我不明白为什么ltcmalloc会导致问题 - 它只是一个不同的内存分配器,它不应该影响对象的初始化方式...... -
我相信您知道您已经为指针分配了 100 GB 空间;如果您需要为每个指向分配不同的东西,您将需要至少两倍的内存(因为即使是单个字符的分配通常在 64 位机器上每次分配使用至少 16 个字节)。这是很多主内存。这不是您的问题的直接因素,但如果您没有很多主内存,您的代码将会非常缓慢。
-
不是 100 GB,而是 200 GB。在 64 位环境中,指针占用 8 个字节。然后将这些指针用于类似大小的数据块上,代表一个巨大的短链表数组。排序的数据结构。然而,问题是,我开始出现错误/错误/任何初始化的指针。我不确定我的下一步是什么。
-
您可能遇到了硬件问题。
标签: c++ linux pointers memory allocation