Как shared_ptr реагирует, когда назначается новая переменная? - PullRequest
0 голосов
/ 10 марта 2020

Привет, члены stackoverflow,

В настоящее время я пробую свои силы на c ++ (в основном программировал на C#) и интересовался управлением памятью при использовании общих указателей.

I У меня есть класс, который в основном читает набор переменных из текстового файла:

constructor(string file){
//..do stuff with file

s = new string(valuefromfile);
array_i = new int{value1, value2}
}
private:
shared_ptr<string> s;
shared_ptr<int*> array_i;

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

Теперь мой вопрос

Если я читаю в новом файле с классом , "s" и "array_i" получат новые значения:

void readnewfile(string file){
//...do stuff with file
s = new string(newstring);
i = new int{ newvalue1, newvalue2, newvalue3 };
}

теперь на начальные значения больше не ссылаются эти умные указатели. Означает ли это, что память освобождена, или мне нужно следить за чем-то определенным c, чтобы предотвратить утечки памяти?

Приветствия

1 Ответ

0 голосов
/ 10 марта 2020

Спасибо Шеффу за ответ на мой вопрос:

Общий указатель использует счетчик ссылок. Если общий указатель переопределен, счетчик ссылок старого содержимого уменьшается (если он есть). Если оно достигает 0, то удаленное соединение (Я называю это "Последний уход выключает свет." - принцип.) Однако, пожалуйста, взгляните на std :: make_shared (), который является лучшей заменой нового для std :: shared_ptr. - Шефф

И спасибо Натану Оливеру за его ответ:

Вам не нужны умные указатели для этого вообще. Член std :: string и член std :: vector должны быть всем, что вам нужно. С ++, ИМХО, намного сложнее и тоньше, чем C#. Если вы новичок в C ++, я советую вам забыть о C# и приобрести хорошую книгу по C ++, чтобы вы могли увидеть подход C ++ к программированию, например, указатели действительно нужны только при использовании полиморфизма. - NathanOliver

Да, вектор намного лучше, чем переопределение массивов каждый раз и когда я читаю в новом файле myvector.clear (); кажется, делает трюк без каких-либо утечек.

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