C++ &引用;未分配要释放的malloc错误指针";仅在模拟器中出错:
当我在实际设备上调试时,没有错误,但是当我使用模拟器时,Xcode的调试器控制台在运行时显示以下错误: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,
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);
}