C++ &引用;未分配要释放的malloc错误指针";仅在模拟器中出错:

C++ &引用;未分配要释放的malloc错误指针";仅在模拟器中出错:,c++,ios,C++,Ios,当我在实际设备上调试时,没有错误,但是当我使用模拟器时,Xcode的调试器控制台在运行时显示以下错误: malloc: *** error for object 0xaaaaaaaa: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug 错误总是发生在另一个类的构造函数中的同一行: Segment *segment = new Segment(0.0,0.0,3.0,

当我在实际设备上调试时,没有错误,但是当我使用模拟器时,Xcode的调试器控制台在运行时显示以下错误:

malloc: *** error for object 0xaaaaaaaa: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
错误总是发生在另一个类的构造函数中的同一行:

Segment *segment = new Segment(0.0,0.0,3.0,1.3,10);
this->segments.push_back(segment); // Malloc error at this line
我的班级:

class Segment {

private:

    float ajc;
    float frl;
    std::unordered_map<int,int> jgrc;
    std::vector<int> lorb;

public:

    std::tuple<float,float> getMjt();
    float getBuw();
    ….

    Segment(float a, float f,float g, float lo, float u){
    ……
    };
};
类段{
私人:
浮动ajc;
浮动frl;
std::无序地图jgrc;
std::载体lorb;
公众:
std::tuple getMjt();
float getBuw();
….
分段(浮动a、浮动f、浮动g、浮动lo、浮动u){
……
};
};
在模拟器上,无论iOS版本如何,都会出现错误。在设备上,无论版本如何,都没有错误


我听说过3的规则,但在这种情况下,我不认为我需要应用它,因为默认编译器提供的代码应该可以工作(除非我弄错了)我做错了什么,如何解决这个问题?既然设备上没有报告错误,我应该忽略它吗?

首先进行空检查以避免运行时错误。我在VS上尝试了一个伪代码,它似乎起了作用。我希望你的向量是相似的

Segment *segment = new Segment(0.0, 0.0, 3.0, 1.3, 10);
std::vector<Segment*> vec;
if (NULL != segment)
    vec.push_back(segment);

段*段=新段(0.0,0.0,3.0,1.3,10);
std::vec;
如果(空!=段)
向量推回(段);

我认为您的模拟器存在一些问题,工作不正常。

解决方案可行,但我不明白为什么。如果有更多C++的人能很好地解释它,我会把它标记为正确的答案。 以下代码在创建段的类的构造函数中运行:

Segment *segment = new Segment(0.0,0.0,3.0,1.3,10);
this->segments.push_back(segment); // Malloc error at this line
首先,我使用对象而不是指针。然后我将代码移出构造函数,而是在创建类的实例后立即调用它

假设我的班级是:

class MyClass{
    std::vector<Segment> segments;
}
其中:

createSegments(){
    Segment segment = Segment(0.0,0.0,3.0,1.3,10);
    segments.push_back(segment);
}

我对C++的经验不是很丰富,所以我不知道为什么会这样。我也不知道为什么原来的错误只出现在模拟器中。

代码>段*=新段(0.01,0.03.1,1.3,10);此->分段。向后推(分段)为什么是
段的向量
指针?在我看来,段对象的向量可以正常工作。您没有提供有关
段的信息吗?我的意思是你是如何创建的?看看
malloc:**object 0xaaaaaa的错误:未分配要释放的指针。这显然意味着指针没有正确初始化(该值是调试预初始化值),我怀疑您初始化
段的方式有问题,因为
std::vector
如果在其中放入随机指针值,则不会崩溃。@PaulMcKenzie我刚刚尝试了指针,因为使用对象时会弹出错误。但是指针也存在错误。实际上,您可以在
std::vector
中发送
nullptr
,它不会崩溃在这种情况下检查NULL不起作用,因为
new
在失败时抛出
std::bad_alloc
异常(假设您使用的是标准C++)。使用
nothrow
允许空检查工作。@PaulMcKenzie和menedal:有意义!!!我只是有一个到处检查NULL的习惯:),但仍然不知道为什么会发生异常。我只怀疑模拟器。模拟器正在对指向
0xaaaaaa
的未初始化指针进行初始化,而不是没有初始化(很可能是
nullptr
),这不会导致
delete
失败。在调试环境中执行此操作非常常见。@Spanky段对我来说永远不会为空。我在malloc\u error\u break上设置了一个断点,所以这里没有问题。当您使用对象时,即使不能完全消除不正确地执行wrt指针和动态分配内存管理操作的可能性,也会减少。您的
类在程序的第一次剪切时不应该使用指针。它是可复制的,因为它包含的所有成员都是可安全复制的。只有在合理的情况下,才应该开始使用指针,即使这样,也应该使用智能指针而不是原始指针。
createSegments(){
    Segment segment = Segment(0.0,0.0,3.0,1.3,10);
    segments.push_back(segment);
}