c:3097:sYSMALLOc:Assertion在动态创建的对象的构造函数中失败 我对C++的OOP有点陌生,所以我希望我刚刚犯了一些简单的初学者错误。我有一些代码,给了我一些看似无法解释的malloc错误。我已将代码缩减为仍然崩溃的最小值,如下所示:
MyClass.cpp:c:3097:sYSMALLOc:Assertion在动态创建的对象的构造函数中失败 我对C++的OOP有点陌生,所以我希望我刚刚犯了一些简单的初学者错误。我有一些代码,给了我一些看似无法解释的malloc错误。我已将代码缩减为仍然崩溃的最小值,如下所示:,c++,oop,malloc,C++,Oop,Malloc,MyClass.cpp: #include <vector> using std::vector; #include <string> using std::string; class MyClass{ string * myString1; string * myString2; int length1; int length2; vector< vector<int>* > *
#include <vector>
using std::vector;
#include <string>
using std::string;
class MyClass{
string * myString1;
string * myString2;
int length1;
int length2;
vector< vector<int>* > * myVector;
public:
MyClass(string * a, string * b);
};
MyClass::MyClass(string * a, string * b)
: myString1(a), myString2(b)
{
// commenting both of the lines that access the string sizes
// makes it work
length1 = myString1->size();
// commenting either or both of the following lines makes
// it work
length2 = myString2->size();
myVector = new vector< vector<int>* >;
}
当我运行它时,我得到以下信息:
test: malloc.c:3097: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Aborted
我曾看到valgrind建议将其作为调试此类问题的工具,但我无法从它的输出中理解任何内容。输出很长,所以我粘贴了它
Gdb指向创建新向量的那条线作为问题(这并不太奇怪)。完整的gdb输出为。我发现奇怪的是,如果我不访问任何一个字符串长度,那么创建新向量就没有问题了
我真是不知所措,任何帮助都将不胜感激 主要问题是您用两种不兼容的方式定义了
MyClass
:在MyClass.cpp
中,它有五个数据成员(两个指针、两个整数和另一个指针),但在MyClass.h
中,因此在test.cpp
中,它根本没有数据成员。因此,当您的main
函数调用newmyclass(A,B)
时,系统只为无数据成员版本的MyClass
分配足够的内存,然后调用构造函数,该构造函数初始化未分配内存的数据成员
您需要将类定义从
MyClass.cpp
移动到MyClass.h
,而MyClass.cpp
的第一行应该是#包括“MyClass.h”
。这将确保您没有任何不兼容,因为这样做会导致MyClass.cpp
发出编译错误。主要问题是您以两种不兼容的方式定义了MyClass
:在MyClass.cpp
中,它有五个数据成员(两个指针、两个整数和另一个指针),但是在MyClass.h
中,因此在test.cpp
中,它根本没有数据成员。因此,当您的main
函数调用newmyclass(A,B)
时,系统只为无数据成员版本的MyClass
分配足够的内存,然后调用构造函数,该构造函数初始化未分配内存的数据成员
您需要将类定义从
MyClass.cpp
移动到MyClass.h
,而MyClass.cpp
的第一行应该是#包括“MyClass.h”
。这将确保您没有任何不兼容,因为这样做会导致MyClass.cpp
发出编译错误。您声明了两个完全不同的MyClass
版本;一个在MyClass.h
中,另一个在MyClass.cpp
中。test.cpp
中的main()
函数可以看到MyClass.h中的版本,并将根据该定义分配内存,但MyClass.cpp中的代码是在该类的不同定义上运行的
失败的原因是这两个定义在内存中具有不同的大小和布局
要正确执行此操作,需要在MyClass.h中包含MyClass的完整定义。
i、 e
\ifndef MyClass\u H
#定义MyClass_H
#包括
使用std::string;
类MyClass{
字符串*myString1;
字符串*myString2;
int长度1;
int长度2;
向量<向量*>*我的向量;
公众:
MyClass(字符串*a、字符串*b);
};
#恩迪夫
这是C++的关键之一,甚至私有成员需要在类的公共可访问定义中。 然后您需要在
MyClass.cpp
以及test.cpp
中包含MyClass.h
,并从MyClass.cpp
中删除MyClass
的声明——您只希望类声明出现在一个位置
您还存在内存泄漏,因为您没有给
MyClass
一个析构函数,它将清理在构造函数中分配的内存。写新的
和删除
的更好方法是调查 您已经声明了两个完全不同版本的MyClass
;一个在MyClass.h
中,另一个在MyClass.cpp
中。test.cpp
中的main()
函数可以看到MyClass.h中的版本,并将根据该定义分配内存,但MyClass.cpp中的代码是在该类的不同定义上运行的
失败的原因是这两个定义在内存中具有不同的大小和布局
要正确执行此操作,需要在MyClass.h中包含MyClass的完整定义。
i、 e
\ifndef MyClass\u H
#定义MyClass_H
#包括
使用std::string;
类MyClass{
字符串*myString1;
字符串*myString2;
int长度1;
int长度2;
向量<向量*>*我的向量;
公众:
MyClass(字符串*a、字符串*b);
};
#恩迪夫
这是C++的关键之一,甚至私有成员需要在类的公共可访问定义中。 然后您需要在
MyClass.cpp
以及test.cpp
中包含MyClass.h
,并从MyClass.cpp
中删除MyClass
的声明——您只希望类声明出现在一个位置
您还存在内存泄漏,因为您没有给
MyClass
一个析构函数,它将清理在构造函数中分配的内存。写新的
和删除
的更好方法是调查 接得好,我甚至没有注意到双重定义。谢谢,就是这样!正如我所说,我
#include "../include/MyClass.h"
#include <string>
using std::string;
int main()
{
string * A = new string("foobar");
string * B = new string("foobaz");
MyClass * mc = new MyClass(A, B);
return 0;
}
g++ -ggdb -Wall -c src/test.cpp -o .objects/test.o
g++ -ggdb -Wall -c src/MyClass.cpp -o .objects/MyClass.o
g++ .objects/test.o .objects/MyClass.o -ggdb -Wall -o test
test: malloc.c:3097: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Aborted
#ifndef MyClass_H
#define MyClass_H
#include <string>
using std::string;
class MyClass {
string * myString1;
string * myString2;
int length1;
int length2;
vector< vector<int>* > * myVector;
public:
MyClass(string * a, string * b);
};
#endif