Управление памятью, сохранение переданного значения в ссылочном классе в качестве указателя для последующего использования - PullRequest
0 голосов
/ 17 апреля 2020

Я пишу библиотеку 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 скопирован в правильную память, куда указывает мой указатель?

Также это значение никогда не изменяется и очищается только моим вызовом удаления? И безопасен ли переход по разыменованию указателя?

У меня нет предупреждений, но я чувствую, что код небезопасен.

И дополнительно, могу ли я использовать какие-либо умные указатели для этой задачи?

...