Скажем, у меня есть класс, какДолжен ли я вручную сбросить shared_ptrs в своих собственных деструкторах?
class A {
public: // I know, I know...
shared_ptr<string> aString;
};
я должен иметь деструктор, как
~A() {
aString.reset();
}
для обеспечения того, чтобы право собственности правильно reliquished? Я сделал несколько тестов, и мне кажется, что мне не нужно - то есть, когда экземпляр A выходит из области видимости или удаляется (или сбрасывается, если я ссылаюсь на него через shared_ptr), строка также удаляется (Я сыграл с более сложным примером, чтобы подтвердить это). Однако это может быть реализация, специфичная для компилятора, который я использую (clang-700.0.72).
Мой вопрос: всегда ли это так, или лучше явно сбросить эти экземпляры, как если бы я удалил любой другой немой указатель?
Вы должны рассмотреть, что вам нужно в копии ctor и присвоении. По умолчанию вы получите второй общий указатель на один и тот же объект с увеличенным счетчиком акций (мелкая копия). Если вам нужна глубокая копия, вы должны сами ее организовать. (Необычно, потому что все дело в shared_ptr заключается в совместном использовании, а глубокая копия означает отсутствие совместного использования). – MSalters
Да, если мне нужно поделиться собственностью - краткосрочной или долгосрочной - я бы ожидал получить все подсчеты использования, поднятые одним. В конкретном случае, вызвавшем мой вопрос, у меня есть класс, который, скорее всего, будет иметь только одного владельца, но ему необходимо твердо придерживаться этого члена, что также означает, что указатель в моем реальном случае никогда не будет использоваться вне класса, и даже если это произойдет, оно будет по крайней мере равно + 1'd от случайных удалений (что, как мне известно, вряд ли произойдет, потому что это не библиотечный код :) – Morpheu5
Не лучше ли вы использовать 'std :: unique_ptr' в этом случае и раздача ссылок? Если кто-нибудь собирается называть «delete» на ссылке, я считаю, что вы имеете право сделать имитацию Линуса Торвальдса. – MSalters