Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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:3097:sYSMALLOc:Assertion在动态创建的对象的构造函数中失败 我对C++的OOP有点陌生,所以我希望我刚刚犯了一些简单的初学者错误。我有一些代码,给了我一些看似无法解释的malloc错误。我已将代码缩减为仍然崩溃的最小值,如下所示:_C++_Oop_Malloc - Fatal编程技术网

c:3097:sYSMALLOc:Assertion在动态创建的对象的构造函数中失败 我对C++的OOP有点陌生,所以我希望我刚刚犯了一些简单的初学者错误。我有一些代码,给了我一些看似无法解释的malloc错误。我已将代码缩减为仍然崩溃的最小值,如下所示:

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>* > *

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>* > * 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