Нужно ли выделять память для указателя на конструктор? - PullRequest
2 голосов
/ 23 февраля 2012

У меня есть конструктор для моего Arduino-кода, который выглядит примерно так:

class X {
  private:
    char* _name;
  public:
    X(char*);
}

X::X(char* name) {
  _name = name;
}

Мой вопрос: мне нужно выделить буфер символов вместо того, чтобы полагаться только на указатель строки, который былпрошло?Я не работаю со строкой (кроме как сократить ее).Кажется, я пока не сталкиваюсь с какими-либо проблемами, но я хотел проверить.

Это специфично для arduino, но ответы на C и C ++ также приветствуются.

Ответы [ 3 ]

3 голосов
/ 23 февраля 2012

Это зависит.

По сути, при таком коде, вы требуете, чтобы время жизни имени было больше, чем у экземпляра класса. Если имя всегда является строковым литералом, то есть X ("foo"), тогда это приемлемо. В противном случае вызывающая сторона должна была бы выделить строку, что является требованием к контракту со странным и подверженным ошибкам требованием.

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

3 голосов
/ 23 февраля 2012

В этом случае вы можете столкнуться с проблемами.

X foo() {

      char ar[10];
      strcpy(ar,"Hello");

      X obj(ar);

      return obj;
} // ar is deallocated here.

Но возвращенная переменная-член объекта _name все еще указывает на ar, который был ранее в стеке. Поэтому лучше выделить память, а затем освободить ее, когда она больше не нужна.

3 голосов
/ 23 февраля 2012

Вам не нужно выделять буфер, но он, вероятно, более надежен. Тем более, что вы находитесь во встроенной системе, скорее всего, без отладчика, поэтому, если кто-то передает вам строку из стека вызывающего, вы попадаете в ловушку. Попытка выяснить, в чем проблема такого рода, похожа на иголку в стоге сена. Короче говоря, если кто-то передает вам некоторые данные, очень трудно гарантировать, что память будет сохраняться, поэтому вам лучше позаботиться о распределении самостоятельно.

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