Я пишу библиотеку C ++ / CLI. Я хочу максимально избегать использования указателей, но сейчас я не могу избежать этого. Я хочу написать безопасный код без утечек памяти и тому подобное. Итак, взгляните на этот пример:
class A; // from library, I don't know about
class ref Class {
public:
retrieveValue();
useValue();
private:
A* value = nullptr; // have to use pointer
}
Итак, в первом методе retrieveValue()
я получаю значение A
из библиотеки, переданной как значение:
Class::retrieveValue() {
if(value)
delete value;
A tmp = AHelper::value(); // gives me a value
value = new A(tmp);
}
Там Сначала я удаляю старое значение, если оно установлено, затем получаю значение tmp и после этого создаю экземпляр моего значения с полученным значением.
В useValue()
, затем я использую значение следующим образом:
Class::useValue() {
if(value)
AHelper::something(*value);
}
подпись AHelper
:
A AHelper::value();
void AHelper::something(const A& value);
Сейчас я не совсем уверен, правильно ли обработана память. Есть ли опасности, такие как утечки памяти?
Это правильный способ сохранить переданное значение в моем указателе, чтобы оно не выходило из области видимости?
Потому что в моем понимании tmp
недействителен после retrieveValue
. Поэтому я должен предположить, что tmp
скопирован в правильную память, куда указывает мой указатель?
Также это значение никогда не изменяется и очищается только моим вызовом удаления? И безопасен ли переход по разыменованию указателя?
У меня нет предупреждений, но я чувствую, что код небезопасен.
И дополнительно, могу ли я использовать какие-либо умные указатели для этой задачи?