Утечка в контейнере STL - PullRequest
       6

Утечка в контейнере STL

1 голос
/ 21 декабря 2010

Я использую векторный контейнер для хранения экземпляров объекта, который содержит 3 целых и 2 std::string с, это создается в стеке и заполняется из функции в другом классе, но запуск приложения через deleteaker показывает, что std::string с объекта все просочились. Вот код:

// Populator function:
void PopulatorClass::populate(std::vector<MyClass>& list) {
    // m_MainList contains a list of pointers to the master objects
    for( std::vector<MyClass*>::iterator it = m_MainList.begin(); it != m_MainList.end(); it++ ) {
        list.push_back(**it);
    }
}

// Class definition
class MyClass {
private:
    std::string m_Name;
    std::string m_Description;
    int m_nType;
    int m_nCategory;
    int m_nSubCategory;
};

// Code causing the problem:
std::vector<MyClass> list;
PopulatorClass.populate(list);

Когда он запускается через deleteaker, утечка памяти находится в распределителе для классов std::string.

Я использую Visual Studio 2010 (CRT).

Есть ли что-то особенное, что мне нужно сделать, чтобы string s удалялся правильно при размотке стека и удалении vector?

Спасибо, J

Ответы [ 3 ]

6 голосов
/ 21 декабря 2010

Может быть Утечка памяти при std::vector<std::string> или что-то в этом роде.

3 голосов
/ 21 декабря 2010

Каждый раз, когда у вас возникает проблема с реализацией STL, которая делает что-то странное или неправильное, например утечку памяти, попробуйте это :

  • Воспроизведите самый простой примерчто вы пытаетесь достичь. Если он работает без утечки, то проблема в том, как вы заполняете данные. Это наиболее вероятный источник проблемы (я имею в виду ваш собственный код).

Не проверенный простой на лету пример для вашей конкретной проблемы:

#include <string>
#include <sstream>


// Class definition
struct MyClass  { // struct for convenience
    std::string m_Name;
    std::string m_Description;
    int m_nType;
    int m_nCategory;
    int m_nSubCategory;
};


// Prototype of populator function:
void populate(std::vector<MyClass>& list)
{
    const int MAX_TYPE_IDX = 4;
    const int MAX_CATEGORY_IDX = 8;
    const int MAX_SUB_CATEGORY_IDX = 6;

    for( int type_idx = 0; type_idx < MAX_TYPE_IDX ; ++type_idx)
        for( int category_idx = 0; category_idx < MAX_CATEGORY_IDX ; ++category_idx)
             for( int sub_category_idx = 0; sub_category_idx < MAX_SUB_CATEGORY_IDX ; ++sub_category_idx)
             {
                   std::stringstream name_stream;
                   name_stream << "object_" << type_idx << "_" << category_idx << "_" << sub_category_idx ;
                   std::stringstream desc_stream;
                   desc_stream << "This is an object of the type N°" << type_idx << ".\n";
                   desc_stream << "It is of category N°" << category_idx << ",\n";
                   desc_stream << "and of sub-category N°" << category_idx << "!\n";

                   MyClass object;
                   object.m_Name = name_stream.str();
                   object.m_Description = desc_stream.str();
                   object.m_nType = type_idx;
                   m_nCategory = 
                   m_nSubCategory = 
                   list.push_back( object );
             }
}


int main()
{
    // Code causing the problem:
    std::vector<MyClass> list;
    populate(list);

    // memory leak check?
    return 0;
 }
  • Если у вас все еще есть утечка памяти, сначала убедитесь, что она не является ложноположительной в вашей программе обнаружения утечек .
  • Тогда, если это не так, Google за проблемы утечки памяти с вашей реализацией STL (большую часть времени на сайте разработчика компилятора).Разработчик может предоставить инструмент отслеживания ошибок, в котором вы можете найти ту же проблему и потенциальное решение.
  • Если вы все еще не можете найти источник утечки, возможно, попытайтесь построить свой проект сдругой компилятор (если вы можете) и посмотрите, будет ли он иметь такой же эффект.Опять же, если утечка все еще происходит, проблема может быть связана с вашим кодом.
0 голосов
/ 26 мая 2013

Вероятно, та же проблема с корнем, что и у ссылки Алексея.В поставленной версии нарушен код перемещения для basic_string.MS отказалась от нас, пользователей VC10, поэтому вы должны исправить это самостоятельно.в файле xstring у вас есть это:

_Myt& assign(_Myt&& _Right)
    {        // assign by moving _Right
    if (this == &_Right)
        ;
    else if (get_allocator() != _Right.get_allocator()
        && this->_BUF_SIZE <= _Right._Myres)
        *this = _Right;
    else
        {        // not same, clear this and steal from _Right
        _Tidy(true);
        if (_Right._Myres < this->_BUF_SIZE)
            _Traits::move(this->_Bx._Buf, _Right._Bx._Buf,
                _Right._Mysize + 1);
        else
            {        // copy pointer
            this->_Bx._Ptr = _Right._Bx._Ptr;
            _Right._Bx._Ptr = 0;
            }
        this->_Mysize = _Right._Mysize;
        this->_Myres = _Right._Myres;

        _Right._Mysize = 0;
        _Right._Myres = 0;
        }
    return (*this);
    }

Обратите внимание на последние

_Right._Myres = 0;

, которые должны происходить только при последнем условии, для короткого случая_Право лучше оставить в покое.

Поскольку емкость установлена ​​на 0 вместо 15, другой код будет занимать непреднамеренную ветвь в функции Grow (), когда вы назначите другую небольшую строку, и выделит блок памяти только длярастоптать указатель с непосредственным содержимым строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...