Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;新建/删除错误? 我现在在C++中实现了素数筛选器,我设计了代码,这样我就可以控制筛子的大小(通过main函数中的整数文字),但是我始终都会遇到一些奇怪的错误。几年来我没有使用C++,但我记得使用新< /Cord>和 Debug < /Cord>操作符来管理堆内存。p>_C++_Heap_Valgrind_New Operator_Delete Operator - Fatal编程技术网

C++;新建/删除错误? 我现在在C++中实现了素数筛选器,我设计了代码,这样我就可以控制筛子的大小(通过main函数中的整数文字),但是我始终都会遇到一些奇怪的错误。几年来我没有使用C++,但我记得使用新< /Cord>和 Debug < /Cord>操作符来管理堆内存。p>

C++;新建/删除错误? 我现在在C++中实现了素数筛选器,我设计了代码,这样我就可以控制筛子的大小(通过main函数中的整数文字),但是我始终都会遇到一些奇怪的错误。几年来我没有使用C++,但我记得使用新< /Cord>和 Debug < /Cord>操作符来管理堆内存。p>,c++,heap,valgrind,new-operator,delete-operator,C++,Heap,Valgrind,New Operator,Delete Operator,我的问题如下 该程序适用于某些筛网尺寸,但不适用于其他筛网尺寸,且效果并非严格线性。例如,如果我将筛的大小设置为10000,程序运行良好,但如果我将筛的大小设置为1000,程序就会崩溃,并显示一条相当神秘的(以我的经验而言)消息,这条消息总是让我(通过谷歌)找到关于C malloc断言错误的页面。此外,该程序在插入delete语句的情况下可以正常运行10000次,但如果我在valgrind中运行另一条无用的(对我而言)消息,程序将崩溃。结果,我甚至不能在自己的DX上调试这该死的东西 有什么智慧的

我的问题如下

该程序适用于某些筛网尺寸,但不适用于其他筛网尺寸,且效果并非严格线性。例如,如果我将筛的大小设置为10000,程序运行良好,但如果我将筛的大小设置为1000,程序就会崩溃,并显示一条相当神秘的(以我的经验而言)消息,这条消息总是让我(通过谷歌)找到关于C malloc断言错误的页面。此外,该程序在插入delete语句的情况下可以正常运行10000次,但如果我在
valgrind
中运行另一条无用的(对我而言)消息,程序将崩溃。结果,我甚至不能在自己的DX上调试这该死的东西

有什么智慧的话吗

特别是,为什么程序会因为较小的输入而崩溃?从理论上讲,这不太可能导致堆错误,不是吗?此外,为什么
valgrind
无法运行程序,而它可以自行运行?我怀疑(再次)这与new/delete操作符的错误或丑陋使用有关,但我不能完全肯定。(关于
valgrind
)让我特别困惑的部分是,它在错误中提到我在
无符号长
上使用
new
运算符,据我所知,这不是我所做的(至少不是特别做的)。我假设这是一些我不熟悉的与编译器相关的细节,但我也不能完全确定

代码(带有delete语句;适用于10000大小,但不能通过valgrind):

将大小更改为1000时出错:

a.out: malloc.c:2392: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
Aborted (core dumped)
编辑:

我非常感谢所有的(实际的)帮助!多亏了下面的答案,程序现在将运行大多数输入(当然不会太大),但我仍然得到Valgrind错误。我真的不太介意,但我很想知道发生了什么。我尝试了下面的建议,将随机素数的选择机制更改为
((long)rand\u int1)%prime\u list\u size)而不是
((长)rand\u int1)*prime\u list\u size)/rand\u MAX
,但我在Valgrind方面没有明显的结果。我仍然无法确切地说出无效堆写入的来源。我将修改代码,以查看是否是我的删除导致了该循环,并将向您报告。

 do
    {
        b++;
        sieve[b*a] = false;
    } while (b*a < size);
do
{
b++;
筛[b*a]=假;
}而(b*a
在检查
b*a
之前,对
分配进行筛选[b*a]
。这允许将元素分配到数组的末尾。这是该循环最后一次迭代中未定义的行为


您最好使用
std::vector
[注意它有一些其他向量没有的限制]或
std::bitset
,而不是手动使用操作符
new
delete
。请记住,仍然有必要确保您的代码不会从标准容器的末端脱落。

我发现您的代码中存在两个问题

第一个是:

   do
   {
       b++;
       sieve[b*a] = false;
   } while (b*a < size);
我看到的另一个问题是:

   do
   {
       b++;
       sieve[b*a] = false;
   } while (b*a < size);
long rand\u num1=((long)rand\u int1)*prime\u list\u size)/rand\u MAX

long rand\u num2=((long)rand\u int2)*prime\u list\u size)/rand\u MAX

乘法中的项可能导致溢出。我猜您想要得到一个小于
大小的随机索引?你可以这样做:

long rand_num1 = (((long) rand_int1) % prime_list_size);
long rand_num2 = (((long) rand_int2) % prime_list_size);

当然,这不会产生一个完美的均匀分布,但它会起作用。要获得更好的分布,请查看std库的数字随机生成器,以及它的
向量
,这是一个非常好的工具,可以帮助您完成工作。

解决此类问题的正确工具是调试器。在询问堆栈溢出之前,应该逐行检查代码。如需更多帮助,请阅读。至少,您应该[编辑]您的问题,以包括一个重现您的问题的示例,以及您在调试器中所做的观察。尽管我非常感谢向下投票和链接,但我相信我已经涵盖了这两个问题的所有内容。我对问题进行了编辑,使其更具体。感谢您的帮助,不过.valgrind有一个选项,可以在出现内存冲突错误时进入调试器。在程序试图损坏内存时,您将被转储到调试器中。使用该选项,您应该能够准确地确定错误是什么。
   while (b*a < size)
   {
       sieve[b*a] = false;
       b++;
   }
long rand_num1 = (((long) rand_int1) % prime_list_size);
long rand_num2 = (((long) rand_int2) % prime_list_size);