Я имею дело с индивидуально написанным односвязным списком на работе, элементами которого являются умные указатели на объекты.Проблема заключается в том, что после успешной вставки определенного количества элементов в список (например, 50000) программа завершает работу с ошибкой сегментации, когда список выходит из области видимости и элементы начинают разрушаться один за другим (с помощью интеллектуального указателя).50000 элементов создаются успешно, но каждый раз, когда объект 43256 (например) уничтожается, программа вылетает.
Примечание. При работе с небольшим количеством объектов - 5000, 10000, 20000, ... -проблем нет вообще.
Мы используем C ++ 98 standart и библиотеки Boost 1.55.0 C ++.
Программа возникла в Red Hat, но я также попробовал ее локально в Ubuntu -та же сделкаТо, что я попробовал только для эксперимента, использовало std :: list, std :: vector, boost :: container :: slist вместо написанного односвязного списка, и проблема исчезла.Но я действительно хочу понять, откуда возникла проблема.
Вот пример кода, который воспроизводит проблему:
#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} )
Заранее спасибо, я действительно озадачен, почему произошел сбой, и я занимался этим уже 1-2 недели ...