Список инициализации членов копирует строку C++

если я использую список инициализации членов в моем конструкторе класса, в котором есть char*, копирует ли он значение в новую выделенную память или просто указывает указатель на то же значение?

ex.

MyString::MyString(const MyString & other) : m_str(other.m_str) {}

это будет хорошо или я должен запускать ячейку за ячейкой, чтобы скопировать информацию?

РЕДАКТИРОВАТЬ: просто чтобы уточнить вопрос, я изменил строку.


person Ofek .T.    schedule 25.01.2016    source источник
comment
Вы можете посмотреть: Что такое правило трех?   -  person NathanOliver    schedule 25.01.2016
comment
Он называется список инициализации, потому что это список инициализаций. Это будет похоже на char *m_str = other.m_str;   -  person M.M    schedule 25.01.2016
comment
Пожалуйста, предоставьте по крайней мере соответствующее скелетное определение вашего класса.   -  person Kerrek SB    schedule 25.01.2016
comment
Когда вы говорите, копирует ли значение, а) ссылается ли оно на конструктор (если да, пожалуйста, скажите об этом и не играйте в игру с местоимениями) и б) копирует значение, означает копирует строку, на которую указывает указатель to, а не копировать значение указателя?   -  person Kerrek SB    schedule 25.01.2016
comment
это будет нормально, или я должен копировать информацию ячейка за ячейкой? Я бы сказал, что это довольно ясно.   -  person Lightness Races in Orbit    schedule 25.01.2016
comment
Пожалуйста, уточните, что означает «все будет хорошо». Пожалуйста, покажите деструктор вашего класса, если вы его определили.   -  person Kerrek SB    schedule 25.01.2016
comment
Я уже получил свой ответ, так что вы можете просто забыть об этом. Мне не нужно никому показывать вам деструктор, потому что это общий вопрос, я просто привожу код для примера вызова IL. Я задавался вопросом, будет ли это дублировать указатель, который указывает на char[] или он действительно глубоко скопирует char[] и создаст указатель для этого, я уже предполагал, что он не будет глубоко копировать его, но попросил быть в безопасности. Итак, я получил свой ответ, что в IL он просто копирует то, что получает - как если бы это был указатель, он просто копировал бы сам указатель. Спасибо. Теперь все понятно и нет необходимости в дальнейших вопросах?   -  person Ofek .T.    schedule 26.01.2016


Ответы (3)


Я просто копирую указатель, поэтому они оба будут указывать на одну и ту же строку.

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

person Bo Persson    schedule 25.01.2016
comment
Спасибо, все, что я хотел знать, копирует ли он ptr или значение в новое пространство. - person Ofek .T.; 25.01.2016
comment
@Ofek.T.: Конечно, вы могли бы определить это самостоятельно, просто напечатав оба указателя как void* и сравнив. - person Lightness Races in Orbit; 25.01.2016

Это делает оба:

  • Он копирует указатель.

  • Копия указателя указывает на то же самое, что и оригинал.

person Kerrek SB    schedule 25.01.2016
comment
Это не то и другое в том смысле, что описал ОП. - person Lightness Races in Orbit; 25.01.2016
comment
@LightnessRacesinOrbit: Хм ... может быть, с большим количеством интерпретационных покачиваний ... но, как написано, OP говорит, что в моем классе есть указатель char; копирует ли конструктор копирования значение, что он и делает. - person Kerrek SB; 25.01.2016
comment
Откровенно говоря, я не думаю, что игнорирование следующих пяти слов будет считаться большим интерпретативным колебанием. копирует ли он значение в новую выделенную память совершенно ясно, что ОП здесь имел в виду глубокую копию. - person Lightness Races in Orbit; 25.01.2016
comment
@LightnessRacesinOrbit: указатель копируется во вновь выделенную память, а именно в память, выделенную для нового экземпляра MyString. Я тщательно подумал о том, не повлияет ли пропуск на смысл, и решил, что не повлияет. - person Kerrek SB; 25.01.2016
comment
Фактически? Нет, не будет. Но мы не говорим о том, что есть; мы говорим о том, что ОП имеет в виду под вопросом, и я применил тщательную эвристику, чтобы определить, что более вероятно, что ОП спрашивал о глубоком и поверхностном копировании, чем что ОП спрашивал о поверхностном и поверхностном копировании (??? ). - person Lightness Races in Orbit; 25.01.2016
comment
@LightnessRacesinOrbit: я все это понимаю. Проблема только в том, что ОП ужасно запутывает значение почти каждого слова в вопросе. Я думаю, что было бы намного лучше сначала исправить вопрос, а затем ответить на четкий вопрос. - person Kerrek SB; 25.01.2016
comment
Я тоже! Заметь, я, в отличие от тебя, на него не ответил ;) ххх - person Lightness Races in Orbit; 25.01.2016
comment
@LightnessRacesinOrbit: отмечено :-) И начал серию комментариев с просьбой исправить вопрос. - person Kerrek SB; 25.01.2016
comment
Желаю вам успехов в ваших поисках! - person Lightness Races in Orbit; 25.01.2016

Переменная-указатель (в очень упрощенном виде) в основном не что иное, как целочисленная переменная, которая специально обрабатывается компилятором. Содержимое (инициализированной) переменной-указателя — это адрес, куда она указывает в памяти.

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

person Some programmer dude    schedule 25.01.2016
comment
Разочарован, увидев, что такой умный парень, как вы, распространяет эти указатели, это чепуха адресов! - person Lightness Races in Orbit; 25.01.2016
comment
@Lightness Races in Orbit Не могли бы вы добавить ссылку или объяснение того, почему указатели не следует рассматривать как держатели адресов? - person Ziezi; 25.01.2016
comment
@simplicisveritatis в синтаксисе ping нет пробелов (например, посмотрите, что я сделал в этом сообщении). Если вы начнете вводить имя и нажмете Tab, оно будет автоматически заполнено до правильного синтаксиса. Я подозреваю, что LRiO имел в виду, что указатели - это ерунда с целыми числами... иначе я понятия не имею, о чем он говорит. - person M.M; 25.01.2016