Просто укажу здесь, но
str = _str;
не будет компилироваться (вы пытаетесь присвоить _str, который является значением строки, переданной по ссылке, str, который является адресом строки). Если бы вы хотели это сделать, вы бы написали:
str = &_str;
(и вам придется изменить либо _str, либо str, чтобы совпадение констант).
Но тогда, как сказала ваша интуиция, вы бы вытекли из памяти любого строкового объекта, на который уже указывал str.
Как указывалось ранее, когда вы добавляете переменную в класс в C ++, вы должны подумать о том, принадлежит ли переменная объекту или чему-то еще.
Если он принадлежит объекту, то, вероятно, вам лучше хранить его как значение и копировать содержимое (но тогда вам нужно убедиться, что копии не будут у вас на спине).
Он не принадлежит, тогда вы можете сохранить его как указатель, и вам не обязательно все время копировать.
Другие люди объяснят это лучше меня, потому что I не очень-то доволен этим.
В результате я часто пишу такой код:
class Foo {
private :
Bar & dep_bar_;
Baz & dep_baz_;
Bing * p_bing_;
public:
Foo(Bar & dep_bar, Baz & dep_baz) : dep_bar_(dep_bar), dep_baz_(dep_baz) {
p_bing = new Bing(...);
}
~Foo() {
delete p_bing;
}
То есть, если объект зависит от чего-либо в смысле «Java» / «Ioc» (объекты существуют в другом месте, вы его не создаете, и вам нужно только вызвать метод для него), я бы сохранил зависимость в качестве ссылки, используя dep_xxxx.
Если бы я создал объект, я бы использовал указатель с префиксом p_.
Это просто для того, чтобы сделать код более "немедленным". Не уверен, что это помогает.
Просто мой 2с.
Удачи с памятью mgt, вы правы, что - сложная часть, пришедшая из Java; не пишите код, пока не почувствуете себя комфортно, иначе вы будете часами гоняться за segaults.
Надеюсь, это поможет!