gpt4 book ai didi

c++ - malloc.c :3097: sYSMALLOc: Assertion fails inside constructor of dynamically created object

转载 作者:行者123 更新时间:2023-11-30 02:05:55 49 4
gpt4 key购买 nike

我对使用 C++ 的 OOP 有点陌生,所以我希望我只是犯了一些简单的初学者错误。我有一些代码给我看似莫名其妙的 malloc 错误。我已将我的代码减少到仍然会崩溃的最小部分,即:

我的类.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>* >;
}

我的类.h

#ifndef MyClass_H
#define MyClass_H

#include <string>
using std::string;

class MyClass{
public:
MyClass(string * a, string * b);
};

#endif

测试.cpp:

#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

我看到有人建议将 valgrind 作为调试此类问题的工具,但我无法从它的输出中理解任何内容。输出很长,所以我粘贴了它here .

Gdb 指出创建新 vector 的那一行是问题所在(这并不奇怪)。完整的 gdb 输出是 here .我觉得奇怪的是,如果我不访问任何一个字符串长度,那么新 vector 的创建就没有问题。

我真的很茫然,任何帮助将不胜感激!

最佳答案

主要问题是你定义了MyClass以两种不兼容的方式:在 MyClass.cpp 中,它有五个数据成员(两个指针、两个整数和另一个指针),但在 MyClass.h 中,因此在 test.cpp , 它根本没有数据成员。因此,当您的 main函数调用 new MyClass(A, B) , 系统只为 MyClass 的无数据成员版本分配足够的内存,然后它调用构造函数,该构造函数初始化您没有为其分配内存的数据成员。

您需要从 MyClass.cpp 移动您的类定义至 MyClass.h , 以及 MyClass.cpp 的第一行应该是 #include "MyClass.h" .这将确保您没有任何不兼容性,因为它会导致 MyClass.cpp如果你这样做会发出编译错误。

关于c++ - malloc.c :3097: sYSMALLOc: Assertion fails inside constructor of dynamically created object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9269566/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com