Ошибка сегментации C ++ - std :: map.insert ()

0

Я получаю ошибку сегментации, когда я пытаюсь вставить ее в свою карту.

Функция выглядит примерно так:

void add(std::string id, std::string name)
{
Asset asset(nullptr, false, name);
mAssets.insert(std::make_pair<std::string, Asset>(id,asset)); <-- This line gives segfault
}

mAssets просто объявляется

std::map<assetID, Asset> mAssets;

И класс Asset (sloppy) объявлен следующим образом:

class Asset
{
public:
   Asset(T* a, bool l, std::string f) : asset(a), loaded(l), filename(f)
    {
    }
  Asset(const Asset& copy) 
{
  loaded   = copy.loaded;
  filename = copy.filename;
  asset    = new T();
  *asset   = *copy.asset;
}
  ~Asset()
{
  delete asset;
}
  Asset& operator=(const Asset& other)
{
  Asset temp(other);
  loaded = temp.loaded;
  filename = temp.filename;
  std::swap(asset,temp.asset);
  return *this;
}

  T*          asset;
  bool        loaded;
  std::string filename;
};
  • 0
    Какой у вас класс ключа assetId?
  • 0
    assetID - это определение типа std :: string
Показать ещё 2 комментария
Теги:
c++11
dictionary
insert
segmentation-fault

3 ответа

4
Лучший ответ

Ваша проблема здесь в вашем конструкторе копирования:

  asset    = new T();
  *asset   = *copy.asset;

Я оставлю это вам, чтобы понять, почему...

  • 0
    исправление ошибки разыменования по-прежнему не устраняет сбой
  • 0
    тогда ваша проблема в другом месте (по крайней мере, в коде, который вы поставили ...)
Показать ещё 4 комментария
1

В вашем конструкторе копирования вы разыгрываете нулевой указатель:

*asset = *copy.asset

из

Asset asset(nullptr, false, name);

Проверьте свои указатели и избегайте разыменования нулевых указателей:

Asset(const Asset& copy) 
{
    loaded   = copy.loaded;
    filename = copy.filename;
    if (copy.asset)
    {
        asset    = new T();   // better may be asset = new T(copy)
        *asset   = *copy.asset;
    }
    else
    {
        asset = nullptr
    } 
}
  • 0
    Это до сих пор не исправляет сбой
  • 0
    Вы пытались проверить удаление указателя на уничтожение ???? На некоторых платформах, таких как Linux и большинство Unix, вы не можете удалить нулевой указатель. Просмотрите все ваши указатели разыменования
Показать ещё 2 комментария
0

* asset = * copy.asset; // вы должны проверить, является ли актив NULL или нет, тогда проверьте на наличие актива

Так будет работать ваш код:

#include <iostream>
#include <map>

using namespace std;

template<class T>
class Asset
{
  public:
    Asset(T* a, bool l, std::string f) : asset(a), loaded(l), filename(f)
  {
  }
    Asset(const Asset& copy) 
    {
      cout<<"copy"<<endl;
      loaded   = copy.loaded;
      filename = copy.filename;
      asset    = new T();
      if(&copy != NULL)
      {
      if(copy.asset != NULL)
        *asset   = *(copy.asset);
      }
    }
    ~Asset()
    {
      delete asset;
    }
    Asset& operator=(const Asset& other)
    {
      Asset temp(other);
      loaded = temp.loaded;
      filename = temp.filename;
      std::swap(asset,temp.asset);
      return *this;
    }

    T*          asset;
    bool        loaded;
    std::string filename;
};

std::map <string,Asset<int> > mAssets;

void add(std::string id, std::string name)
{
  Asset<int> asset(NULL, false, name);
  mAssets.insert(std::make_pair<std::string, Asset<int> >(id,asset)); //<-- This line gives segfault
}


int main()
{
  add("1","hi");
  cout<<"run"<<endl;

}
  • 0
    какова цель этого -> if(&copy != NULL)
  • 0
    if (& copy! = NULL) можно удалить, но перед копированием данных следует проверить, указывают ли они действительные данные, чтобы убедиться, что конструктор копирования работает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню