C++ c++;项目赢得';无法在Mac上正常运行,但将在Windows上正常运行
正如人们对我说的,我已经把它缩小到了这类代码。。。当尝试将节点添加到列表时,它会中断。给我访问错误等等。(但仅有时)乍一看,例如C++ c++;项目赢得';无法在Mac上正常运行,但将在Windows上正常运行,c++,c++11,C++,C++11,正如人们对我说的,我已经把它缩小到了这类代码。。。当尝试将节点添加到列表时,它会中断。给我访问错误等等。(但仅有时)乍一看,例如first==(Node*)1(在prepend中)是非法的/未定义的,并且会产生随机行为。这取决于芯片和操作系统的内存布局,它将存活、有时工作、总是工作、随机失败或总是失败。Mac和x86芯片的行为完全不同,这一点也不奇怪 代码中还有许多其他的假设,比如int足够大,可以容纳东西;等等 所有这些人们倾向于粉饰的规则都有其原因,其中许多错误在一个体系结构上都可以避免,但
first==(Node*)1
(在prepend
中)是非法的/未定义的,并且会产生随机行为。这取决于芯片和操作系统的内存布局,它将存活、有时工作、总是工作、随机失败或总是失败。Mac和x86芯片的行为完全不同,这一点也不奇怪
代码中还有许多其他的假设,比如int
足够大,可以容纳东西;等等
所有这些人们倾向于粉饰的规则都有其原因,其中许多错误在一个体系结构上都可以避免,但在另一个体系结构上却无法避免。在错误地从问题中删除代码的相关部分之前,错误是相当明显的 DoubleLinkedNode的构造函数无法将
nextNode
和previousNode
类成员初始化为NULL。这会导致未定义的行为
只是因为C++程序在特定的行上崩溃,这并不意味着bug在哪里。 将新节点添加到列表时,您正在崩溃
但是错误在于
insertNodeAfter()
正在取消对未初始化指针的引用。这个错误是因为构造函数未能将它们初始化为NULL。请尝试将代码缩小到只有问题的部分,例如通过调试。请学习如何创建,以及。解决此类问题的正确工具是调试器。在询问堆栈溢出之前,应该逐行检查代码。如需更多帮助,请阅读。至少,您应该[编辑]您的问题,以包括一个重现您的问题的示例,以及您在调试器中所做的观察。内存错误(如您似乎被警告)会显示未定义的行为,因为您的观察听起来确实合理。如果你的程序有未定义的行为,那么就没有理由从C++的角度来解释它为什么会这样做。首先要搞清楚内存管理。@MichaelMariani这通常是您被调用的未定义行为击中的症状。请使用内存调试工具,如(或类似工具)来帮助您找到问题。当然,也可以在调试器中一行一行地遍历代码。您建议使用什么来代替first==(Node*)1?这并不是有时破坏它的原因。有时它的append.I怀疑(Node*)1
是(Node*)0
的打字错误。正确的使用方法是nullptr
,它不需要强制转换。@MichaelMariani当您有未定义的行为时,它不一定会在导致问题的同一代码中消亡。未定义的行为通常会以一种直到很久以后才被注意到的方式破坏内存。这很有道理。谢谢你,我没有编写它提供给我们用来找出bug的代码。我找到了其中的大部分,并让代码在uni工作,但当我回到家时,它就会在我的mac上坏掉。
/*********************************************************************************************
* Function: Appends the Node newelement to the end of the List
*********************************************************************************************/
void append(const T &newelement)
{
Node *N = new Node(newelement);
if(first == (Node*)0)
{
first = N;
last = N;
_length = 1;
}
else
{
last->insertNodeAfter(N);
last = N;
_length++;
}
};
/*********************************************************************************************
* Function: Appends the Node newelement to the end of the List
*********************************************************************************************/
void prepend(const T &newelement)
{
Node *N = new Node(newelement);
if(first == (Node*)1)
{
first = N;
last = N;
_length = 1;
}
else
{
first->insertNodeBefore(N);
first = N;
_length++;
}
};