我处理工作,其元素是智能指针对象定制编写的单链表。的问题是,在列表中成功地插入一定量的元件后(例如50000),该程序与段错误崩溃当列表超出范围并且元件开始得到破坏逐个(由智能指针)。的50000个元素创建成功,但每次的43256(例如)对象被销毁,程序崩溃。
注意:使用较少的对象打交道 - 5000,10000,20000,... - 有一点问题都没有。
我们使用C ++ 98的标准和Boost 1.55.0 C ++库。
该程序发生在Red Hat,但我也试了一下本地Ubuntu上 - 同样的协议。使用std ::名单,性病::向量是我的尝试只是为了实验目的,提振::容器:: SLIST代替hadwritten单链表和问题走了。但我真的想明白问题出在哪里得来的。
这里是一个重现问题的示例代码:
#include <iostream>
#include "boost/lexical_cast.hpp"
#include "boost/shared_ptr.hpp"
#include "boost/make_shared.hpp"
#include <vector>
class SmartInt;
typedef boost::shared_ptr<SmartInt> BoostSharedPtrSmartInt;
class SmartInt
{
public:
int m_data;
BoostSharedPtrSmartInt m_ptrNext;
void SetNext(BoostSharedPtrSmartInt ptrNext)
{
m_ptrNext = ptrNext;
}
BoostSharedPtrSmartInt GetNext() const
{
return m_ptrNext;
}
};
class IntList
{
public:
BoostSharedPtrSmartInt m_ptrFirst;
BoostSharedPtrSmartInt m_ptrLast;
void AddParameter( BoostSharedPtrSmartInt ptrParam ) throw()
{
if( m_ptrFirst == NULL )
{
std::cout << "ST_TEST First time AddParameter" << std::endl;
m_ptrFirst = m_ptrLast = ptrParam;
}
else
{
m_ptrLast->SetNext( ptrParam );
m_ptrLast = ptrParam;
}
}
};
void test3(int numObjects)
{
IntList list;
int i = 1;
for(; i <= numObjects; ++i)
{
BoostSharedPtrSmartInt bspsi = boost::make_shared<SmartInt>();
list.AddParameter( bspsi );
}
std::cout << "ST_TEST i = " << i << std::endl;
std::cout << "ST_TEST Getting out of scope - everything should get destroyed now!" << std::endl;
}
int main(int argc, char **argv)
{
if(argc != 2)
{
std::cout << "Usage: ./test <number of objects created>" << std::endl;
exit(1);
}
test3( boost::lexical_cast< int >( argv[1] ) );
return 0;
}
要构建项目,我用的CMakeLists.txt如下:
cmake_minimum_required(VERSION 2.6)
project(test)
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
add_executable(test main.cpp)
target_link_libraries( test
${Boost_LIBRARIES} )
在此先感谢,我真的很困惑,为什么崩溃发生和I`ve现在一直在处理这1-2周...
你的程序崩溃因堆栈溢出Botje怀疑。您可以通过显式释放列表中的项目一个接一个列表中的析构函数避免这种情况。
...
class SmartInt
{
public:
...
void Reset() {
m_ptrNext.reset();
}
...
};
class IntList
{
public:
...
~IntList() {
while (m_ptrFirst != m_ptrLast) {
BoostSharedPtrSmartInt tmp = m_ptrFirst->GetNext();
m_ptrFirst->Reset();
m_ptrFirst = tmp;
}
}
};
....