2017-01-19 2 views
-1

Мне интересно, разумны ли интеллектуальные указатели на статические объекты. Например, допустим, у меня есть некоторый статический ресурс и вы хотите передать ссылку на этот статический ресурс на некоторые другие объекты, которым нужен этот ресурс для работы.Хорошо ли shared_ptr на статических объектах?

Один из способов - использовать RAW-указатели, указывающие на этот ресурс. Но теперь мне интересно, эффективны ли интеллектуальные указатели (shared_ptr), и если да, то как это сделать правильно. (должен ли интеллектуальный указатель быть также статическим?).

Вопрос вопроса: если больше объектов с интеллектуальным указателем больше нет, то статический объект, на который указывает умный указатель, будет освобожден (что не является лучшей идеей ...).

Один пример (который заканчивается в аварии в конце выполнения):

struct SomeType { 
    SomeType() { cout << "ctor..." << endl; } 
    ~SomeType() { cout << "dtor..." << endl; } 

    void sayHello() { cout << "Hello!" << endl; } 
}; 


void someFunction(shared_ptr<SomeType> smartPointer) { 
    smartPointer->sayHello(); 
} 

static SomeType st; 
static shared_ptr<SomeType> pt{ &st }; 

void anotherFunction() { 

    someFunction(pt); 
} 

int main() { 
    anotherFunction(); 

    cin.get(); 

} 
+4

Там нет необходимости в shared_ptr здесь вообще. – SergeyA

+8

умные указатели предназначены для лучшего управления * динамическими * сроками службы. Статические переменные уже имеют * статическое * время жизни. – jaggedSpire

+4

«Один из способов - использовать RAW-указатели, указывающие на этот ресурс». Очевидная вещь - использовать ссылку на ресурс. Почему ты не хочешь этого делать? –

ответ

4

Следующие две строки являются недопустимыми.

static SomeType st; 
static shared_ptr<SomeType> pt{ &st }; 

Когда pt уничтожается в конце вашего процесса жизни, он будет delete st. st не был выделен соответствующим new. Это неопределенное поведение.

shared_ptr полезен для управления сложным временем жизни общих объектов, в то время как объекты static имеют очень простые сроки жизни. Неправильно использовать shared_ptr для управления объектами static, и при этом ничего не получится.

+2

Неправильно использовать 'shared_ptr', неправильно использовать' shared_ptr' с дефолтом по умолчанию. –

+0

«Объекты _static имеют очень простые времена жизни» «Область пространства имен статическая функция scope static? – curiousguy

-1

давайте предположим, что я (как класс автора) не знаю, является ли объект статический или динамический

код, который должен быть агностиком абсолютно необходимо использовать shared_ptr<T>.

Этот код, который вы указали, недействителен, поскольку он вызывает удаление объекта со статическим временем жизни.

static SomeType st; 
static shared_ptr<SomeType> pt{ &st }; 

Это просто отлично:

static SomeType st; 
static shared_ptr<SomeType> pt{ std::shared_ptr<SomeType>{}, &st }; 

и что pt может быть использован взаимозаменяемо с "нормальными" экземплярами shared_ptr. std::shared_ptr особенно удобно в связи с этим, так как наличие или отсутствие Deleter не влияет на тип указателя (в отличие, std::unique_ptr<T, custom_deleter<T>> другой тип от `станд :: unique_ptr>)

Это и другие способы задания Deleter, что не делает ничего, описаны в: