std::vector的push_back函数能不能导致什么异常或者错误呢?

James_HIT 2007-03-12 11:35:53
我有一个程序,vector是std::vector<CTestClass *> tmpVector;

但是有些时候调用push_back函数会出一些问题,执行语句停留在:

void push_back(const _Ty& _Val)
{
// insert element at end
if (size() < capacity())
#if _HAS_ITERATOR_DEBUGGING
{ // room at end, construct it there
_Orphan_range(_Mylast, _Mylast);
_Mylast = _Ufill(_Mylast, 1, _Val);
}
#else /* _HAS_ITERATOR_DEBUGGING */
_Mylast = _Ufill(_Mylast, 1, _Val); // 断点在这一句,请问什么错误
#endif /* _HAS_ITERATOR_DEBUGGING */

else
insert(end(), _Val);
}

请问大家遇到过这种情况吗?先谢谢了
...全文
3459 39 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
screwzm 2011-12-02
  • 打赏
  • 举报
回复
我也出现这个错误。
push的是指针,也要拷贝函数吗?
不过我的版本是在release下才会出错,debug下不会出现这个错误。
求解!
chengtg 2011-01-13
  • 打赏
  • 举报
回复
学习...
InfidelX 2011-01-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 steedhorse 的回复:]

push_back本身应该没啥问题。如果出了问题,问题可能是:
(1)那个vector对象本身已经被破坏了,即不是一个状态一致完整的健康对象了。
(2)被push的那个对象的拷贝操作有bug。
[/Quote]
这个正解~!
BuleRiver 2011-01-06
  • 打赏
  • 举报
回复
可能。
内存不足等情况都可能导致。
zhangrunxian 2010-08-18
  • 打赏
  • 举报
回复
我今天也遇到了同样的问题,但还没有解决呢
jstar920 2009-11-29
  • 打赏
  • 举报
回复
碰到过这样的问题:
当内存受限时(此时虚拟内存都快耗尽),由于push_back由于每次发现存储空间不够时,默认会申请原来空间的两倍,此时申请空间时就会发生错误。

因此如果知道 vector需要多少内存的话,最好先用 reserve申请一下空间
zhlandwf 2009-11-29
  • 打赏
  • 举报
回复
vector 压进去 要开辟连续的空间 内存中可能没有那么多少连续的空间给你去开辟
BuleRiver 2009-02-01
  • 打赏
  • 举报
回复
有可能错误,因为push_back函数如果发现空间不够的话,要申请空间,这个时候如果就有可能发生例如new异常
changsheng230 2008-10-04
  • 打赏
  • 举报
回复
vector::push_back可以导致异常,下面的代码将设计产生一个length_error的异常:把vector的capacity规定只容纳10个



// length_error.cpp
// compile with: /EHsc /GR
#include <vector>
#include <iostream>

using namespace std;

template<class _Ty>
class stingyallocator : public allocator<_Ty>
{
public:
template <class U>
struct rebind { typedef stingyallocator<U> other; };
_SIZT max_size( ) const
{
return 10;
};

};

int main( )
{
try
{
vector<int, stingyallocator< int > > myv;
for ( int i = 0; i < 11; i++ ) myv.push_back( i );
}
catch ( exception &e )
{
cerr << "Caught " << e.what( ) << endl;
cerr << "Type " << typeid( e ).name( ) << endl;
};
}


//Sample Output

//Caught vector<T> too long
//Type class std::length_error

VirtualDesktop 2008-10-01
  • 打赏
  • 举报
回复
楼主是不是迭代器使用有误?一般你的迭代器出错就停在这一行
记住vector::push_back有可能重新分配整个内部数据结构的内存,你不能一边使用iterator遍历一边push
tobylee999 2008-09-06
  • 打赏
  • 举报
回复
不要说vector是自己实现的,也不要说vector已经push_back多少G的成员进去了;)
tobylee999 2008-09-06
  • 打赏
  • 举报
回复
成员是指针,没啥好拷贝的。vector被破坏的可能性比较大,但通常应该报错才是,或者可能扯个编译器或调试工具的事~~
coolblackcat 2008-07-31
  • 打赏
  • 举报
回复
会导致迭代器失效,如果push的时候内存重新分配,就会这样
gaoteng1984 2008-07-20
  • 打赏
  • 举报
回复
跟到_Ufill函数里头看看吧。
1.copy constructor 和assignment operator的问题
2. 程序中有非法内存写入,碰巧把这个vector的内存写坏了(几率比较小)

楼主用的是单线程么?STL不支持多线程的,如果是多线程,就会经常出毛病了
fengyan251146 2008-07-13
  • 打赏
  • 举报
回复
我也遇到过这样的问题,有的时候在pushu_back异常,有的时候又没有问题。
等待高手指点
knowledge_Is_Life 2008-05-01
  • 打赏
  • 举报
回复
lz要干嘛?
yjukh 2007-10-30
  • 打赏
  • 举报
回复
是不是编译器问题?
VC6对模式支持不是很好哦
redex 2007-10-29
  • 打赏
  • 举报
回复
mark.
CQZE 2007-10-16
  • 打赏
  • 举报
回复
1.从push_back的定义上看,它会抛出异常,而且是任何的异常。
2.标准容器在插入操作失败以后会回到插入前的状态。
yshuise 2007-10-04
  • 打赏
  • 举报
回复
楼主压入的是指针,不是对象,要什么构造?拷贝?
加载更多回复(19)

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧