Копия const char * с использованием конструктора std :: string - PullRequest
1 голос
/ 26 января 2011

с этим кодом все в порядке?

void SomeClass :: foo(const char * _name) {
     //name is of type const char *
     name = std::string(_name).c_str();
}

похоже, что он работает, но я не уверен, что все в порядке

я должен сделать strcpy старой школы?

Ответы [ 5 ]

6 голосов
/ 26 января 2011

Это нормально, так как он компилируется и не вызывает неопределенного поведения.

Это не нормально, так как имя указывает на недопустимую память после того, как оператор завершит выполнение.

name = std::string(_name).c_str();

В конце этого оператора временный std :: string уничтожается и освобождает память от c_str ().

Должен ли я сделать старую школу?

Нет, просто измените имя на std :: string:

void SomeClass :: foo(const char * _name) {
     //name is of type std::string
     name = _name;
}
3 голосов
/ 26 января 2011

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

2 голосов
/ 26 января 2011

Если вы ничего не делаете с name, это совершенно безопасно.В противном случае, это может произойти сбой в какой-то случайной точке в будущем.Указатель в стиле C, возвращаемый функцией-членом c_str(), действителен только до тех пор, пока существует временный std::string (и до тех пор, пока вы не измените его, чего в этом случае нет).Как только выход из области ограждающих блоков выходит, временное уничтожается, и любое использование name переводит вас в сумеречную зону.

Как и другие предлагали, вы должны превратить name в std::string,В качестве альтернативы - если вам действительно нужно, чтобы остаться char * - вы могли бы просто написать name = strdup(_name).

1 голос
/ 26 января 2011

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

0 голосов
/ 26 января 2011

Я голосую за strcpy. Зачем усложнять простые вещи?

Или даже лучше - поскольку вам, очевидно, потребуется использовать его позже, почему бы не преобразовать его в std::string, а просто использовать его впоследствии, забыв обо всех этих char *?

...