terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_M_construct null not valid

Рейтинг: 1Ответов: 1Опубликовано: 11.08.2023

Мне нужно создать умный указатель на объект класса CsharpMethodUnit. Но когда я пытаюсь выделить память и пишу :

std::shared_ptr<CsharpMethodUnit> CsharpMethodUnitPTR(std::make_shared<CsharpMethodUnit>(name,vozvr,Num));

выводится ошибка:

"terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_M_construct null not valid".

Исходный код:

class CsharpMethodUnit: public IMethodUnit {

public: enum Modifier {
  STATIC = 1,
  //  CONST = 1 << 1,
    VIRTUAL = 1 << 2
};
public: CsharpMethodUnit(const std::string & name,
    const std::string & returnType, Flags
  flags): m_name(name),
m_returnType(returnType),
m_flags(flags) {}
    CsharpMethodUnit(const CsharpMethodUnit & obj)
    {
    this->m_returnType=obj.m_returnType;
    this->m_flags=obj.m_flags;
    this->m_name=obj.m_name;
    this->m_body=obj.m_body;
    this->name1 = obj.name1;
    }
void add(const std::shared_ptr < Unit > & unit, Flags /* flags */ = 0) {
  m_body.push_back(unit);
}
std::string compile(unsigned int level = 0) const {
  std::string result = generateShift(level);
  if (m_flags & STATIC) {
    result += "static ";
  } else if (m_flags & VIRTUAL) {
    result += "virtual ";
  }
  result += m_returnType + " ";
  result += m_name + "()";
  result += " {\n";
  for (const auto & b: m_body) {
    result += b -> compile(level + 1);
  }
  result += generateShift(level) + "}\n";
  return result;
}
 std::string m_name;
std::string m_returnType;
Flags m_flags;
std::vector < std::shared_ptr < Unit > > m_body;};```

Ответы

▲ 1

terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_M_construct null not valid

Ну, видимо, Вы nullptr передаете в конструктор одной из строк (name и/или returnType).

P.S. Я так понимаю, Вы MSVC собираете? Clang (с libcxx) оказался не таким "заботливым" - и приложение завершилось с SIGSEGV. (GCC)