C++ 插入std::vector导致内存分配错误

C++ 插入std::vector导致内存分配错误,c++,memory,vector,C++,Memory,Vector,作为一个大学项目的一部分,我正在从头开始编写一个文本编辑器。我在编写代码以构建和维护核心数据结构时遇到了问题 下面是我的源代码,gcc/g++给出的错误,以及我从gdb获得的stacktrace。下面我将详细介绍我的设计 是的,我确实对Document::insertChar中的所有打印和详细声明感到不安。起初我认为这可能是一个初始化问题。我还在学习gdb的控制权 重要的是,温度向后推(lnd);插入(iter,nline);(lnd是原始的所有nLine)两者都会导致相同的错误 源代码 Doc

作为一个大学项目的一部分,我正在从头开始编写一个文本编辑器。我在编写代码以构建和维护核心数据结构时遇到了问题

下面是我的源代码,gcc/g++给出的错误,以及我从gdb获得的stacktrace。下面我将详细介绍我的设计

是的,我确实对Document::insertChar中的所有打印和详细声明感到不安。起初我认为这可能是一个初始化问题。我还在学习gdb的控制权

重要的是,温度向后推(lnd);插入(iter,nline);(lnd是原始的所有nLine)两者都会导致相同的错误

源代码

Document.cpp : http://pastebin.com/LgGHmir8
Line.cpp : http://pastebin.com/BBhbnxUt
(代码从未在非Linux平台上测试过,使用g++生成的代码可能不会在其他编译器中测试)

错误:

测试:malloc.c:2388:sysmalloc:Assertion`(old_top==((mbinptr)((char*)和((av)->bins[((1)-1)*2])-(struct malloc_chunk,fd))和old_size==0)(无符号长)(old_size>=(无符号长)(无符号长)(无符号长)(struct malloc chunk,fd nextsize))+(2*)-sizu-sizu&&((old_-top)->size&0x1)&((unsigned long)old_-end&(pagesize-1))==0)失败。 中止(堆芯转储)

堆栈跟踪:

(gdb) backtrace
#0  0x00007ffff71d45f8 in raise () from /usr/lib/libc.so.6
#1  0x00007ffff71d5a7a in abort () from /usr/lib/libc.so.6
#2  0x00007ffff7218468 in __malloc_assert () from /usr/lib/libc.so.6
#3  0x00007ffff721a056 in sysmalloc () from /usr/lib/libc.so.6
#4  0x00007ffff721b0a6 in _int_malloc () from /usr/lib/libc.so.6
#5  0x00007ffff721c3d4 in malloc () from /usr/lib/libc.so.6
#6  0x00007ffff7ae70e8 in operator new (sz=24) at /build/gcc/src/gcc-5.3.0/libstdc++-v3/libsupc++/new_op.cc:50
#7  0x0000000000401f15 in __gnu_cxx::new_allocator<Line>::allocate (this=0x7fffffffe950, __n=1) at /usr/include/c++/5.3.0/ext/new_allocator.h:104
#8  0x0000000000401d9e in __gnu_cxx::__alloc_traits<std::allocator<Line> >::allocate (__a=..., __n=1) at /usr/include/c++/5.3.0/ext/alloc_traits.h:182
#9  0x0000000000401b90 in std::_Vector_base<Line, std::allocator<Line> >::_M_allocate (this=0x7fffffffe950, __n=1) at /usr/include/c++/5.3.0/bits/stl_vector.h:170
#10 0x0000000000401654 in std::vector<Line, std::allocator<Line> >::_M_insert_aux (this=0x7fffffffe950, __position=<error reading variable: Cannot access memory at address 0x0>, 
__x=...) at /usr/include/c++/5.3.0/bits/vector.tcc:353
#11 0x000000000040139e in std::vector<Line, std::allocator<Line> >::push_back (this=0x7fffffffe950, __x=...) at /usr/include/c++/5.3.0/bits/stl_vector.h:925
#12 0x0000000000400fff in Document::insertChar (this=0x7fffffffe9b0, chr=10 '\n') at Document.cpp:67
#13 0x00000000004011be in main (argc=1, argv=0x7fffffffeae8) at Document.cpp:204
(gdb)回溯
#在/usr/lib/libc.so.6的raise()中0 0x00007FF71D45F8
#1 0x00007FF71D5A7A位于/usr/lib/libc.so.6的abort()中
#2 0x00007FF7218468位于/usr/lib/libc.so.6中的
#来自/usr/lib/libc.so.6的sysmalloc()中的3 0x00007FF721A056
#来自/usr/lib/libc.so.6的4 0x00007FF721B0A6 in_int_malloc()
#来自/usr/lib/libc.so.6的malloc()中的5 0x00007ffff721c3d4
#6 0x00007FF7AE70E8在/build/gcc/src/gcc-5.3.0/libstdc++-v3/libsupc++/new处的运算符new(sz=24)中:50
#在/usr/include/c++/5.3.0/ext/new\u分配器中分配(this=0x7fffffffe950,n=1)
#8 0x0000000000401d9e位于/usr/include/c++/5.3.0/ext/alloc_traits.h:182
#9 0x0000000000401b90标准::_Vector_base::_M_allocate(this=0x7fffffffe950,u n=1)at/usr/include/c++/5.3.0/bits/stl_Vector.h:170
#std::vector::_M_insert_aux中的10 0x0000000000401654(此=0x7fffffffe950,位置=,
__x=…)at/usr/include/c++/5.3.0/bits/vector.tcc:353
#在/usr/include/c++/5.3.0/bits/stl_vector.h:925处,std::vector::push_back(this=0x7fffffffffe950,_x=…)中的11 0x000000000040139e
#12 0x0000000000400fff位于Document::insertChar(this=0x7fffffffe9b0,chr=10'\n')处。cpp:67
#13 0x00000000004011be位于文档的main中(argc=1,argv=0x7fffffffeae8)。cpp:204
简单介绍一下设计的东西,我用std::vector来保存行(主要是为了方便)。以及类线,类似于 向量,它是一个动态数组的实现。这样做的原因是我最终将在那里保存行元数据

当我尝试使用insert插入一条线时,Vector似乎不喜欢它。 实际上,除了Document::Document()。每当我尝试将直线对象插入向量时,无论是向后推还是插入。它失败了

我。。。不太明白为什么,我想。如果做不到这一点,我将不得不实现我自己的版本,这样我至少能理解发生了什么。
(遗憾的是,你无法在插入和搜索操作中获得O(1)…如果我不需要快速搜索,一个链接列表会很好…

好的,睡了一会儿。回到这里

在复制构造函数中调用
delete[]mData
mData
在复制构造函数的初始化列表中初始化为
NULL
。这就是问题A。更重要的是

std::copy(ln.mData, **mData**+mCapacity, mData);

不知道此时的内存地址是什么。但这肯定不是我们的初衷。这是分配问题的根源。感谢指导我查看复制构造函数的人

请直接在您的问题中添加一个,而不是链接到其他网站上的一大块代码。这不是一个免费的调试服务。我试图复制这个问题,但没有,所以我无法生成它。我会继续寻找隔离问题的方法。目前为止。我不知道是什么引起的。
std::vector
没有什么问题。可能有问题的是您的
结构/类,因为它可能不安全地可复制或可分配,这是vector所要求的。我不是在责怪std::vector。标准库是由比我优秀得多的程序员组合而成的。我知道这个问题几乎可以肯定。我给出了一个基本的复制构造函数和赋值重载。两者都应该进行适当的深度复制。但是显然不是。在放入向量之前,您应该对每个类进行单元测试,以了解复制/分配问题。这可以通过编写一个简单的
main
函数来轻松实现,它所做的就是这样:用类替换
foo
。如果
main
显示任何问题,如双重删除错误、内存泄漏等,请在vector中真正使用类之前在此处修复。