2014-01-15 3 views
4

Как я могу в C++ дублировать std :: string *?C++: как дублировать std :: string *

Я хочу сделать что-то вроде этого:

std::string *str1 = new std::string("test"); 
std::string *str2 = strdup(str1); 

delete str1; 

std::cout << *str2 << std::endl; // result = "test" 
+1

'станд :: string' не * действительно * а char в стеке, он сохраняет только некоторую информацию о состоянии и имеет указатель на массив символов в куче, где хранится фактическое содержимое строки. Есть некоторые оптимизации, которые усложняют историю, но это, по сути, то, что делает 'std :: string' для вас. Он абстрагирует исходный массив символов. Поэтому не используйте указатели на 'std :: string', а используйте ссылки в ваших функциях, таких как 'std :: string &', или даже лучше использовать 'const std :: string &'. – rwols

ответ

18

Если вы действительно должны использовать указатели и динамическое выделение (наиболее вероятно, не), то

std::string *str2 = new std::string(*str1); 

В реальной жизни,

std::string str1 = "test"; 
std::string str2 = str1; 
3

Я уверен, что вы не должны использовать указатели здесь. Использование указателей заставляет вас управлять временем жизни, защищать от исключений и т. Д. Мир ненужной боли.

код вы должны написать это:

std::string str1 = "test"; 
std::string str2 = str1; 
1

Вы просто делаете

std::string *str2 = new std::string(*str1); 

Но я должен спросить, почему вы используете указатели в первую очередь. Что случилось с

std::string str1 = "test"; 
std::string str2 = str1; 

?

+0

Я изучаю C++ и это упражнение. У меня есть 'std :: string *' в 'class', и я должен инициализировать его в функции« конструктор копирования ». Я думаю, что для этого мне нужно дублировать свою строку вместо того, чтобы делать 'my_var (this-> var)'. –

0

Вы можете сделать проще, не вызывая новых и удалять. Например

std::string *str1 = new std::string("test"); 
std::string *str2 = str1; 

std::cout << *str2 << std::endl; // result = "test" 

По крайней мере, в вашем примере, если есть возможность получить доступ к str1 после его удаления, было бы лучше, чтобы написать

std::string *str1 = new std::string("test"); 
std::string *str2 = new std::string(*str1); 

delete str1; 
str1 = nullptr; 

std::cout << *str2 << std::endl; // result = "test" 
+0

_ «без вызова нового и удалить» _: оба примера все еще используют кучу. –

+0

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

+1

Не уверен, что я следую. Вы говорите, что OP мог бы сделать проще, не вызывая 'new' и' delete' (я согласен), но тогда ваш первый пример использует 'new', а второй использует' new' и 'delete' –

Смежные вопросы