Почему Вы не должны использовать ссылки на интеллектуальные указатели?

Попробуйте это:

from tkinter import *

def entry():
    ent[i].configure(state = NORMAL)

window=Tk()

nac = {}
ent = {}

for i in range(10):
    de = IntVar()
    nac[i]=IntVar()

na=Checkbutton(window, text='%s' % (i), borderwidth=1,variable = nac[i],
               onvalue = 1, offvalue = 0,command=entry)
na.grid(row=i, column=0)
ent[i]=Entry(window,textvariable=de, state = DISABLED)
ent[i].grid(column=1,row=i,padx=20)
window.mainloop()
24
задан coppro 7 October 2008 в 16:01
поделиться

5 ответов

Принятие Вас говорит о shared_ptr здесь...

это просто из-за использования ссылки интеллектуального указателя после его уничтоженного?

Это - хороший ответ. Вы не можете знать абсолютно время жизни указателя, который Ваша ссылка отсылает также.

Для обхождения этого Вы хотели бы изучить повышение:: weak_ptr. Это не участвует в подсчете ссылок. Когда необходимо использовать его, это дает Вам shared_ptr, который уходит однажды Ваш сделанный с ним. Это также сообщит, когда отнесенный в указатель будет собран.

От документация weak_ptr

weak_ptr шаблон класса хранит "слабую ссылку" на объект, этим уже управляет shared_ptr. Для доступа к объекту weak_ptr может быть преобразован в shared_ptr с помощью shared_ptr конструктора или блокировки функции членства. То, когда последний shared_ptr к объекту уходит, и объект удален, попытка получить shared_ptr из weak_ptr экземпляров, которые относятся к удаленному объекту, перестанет работать: конструктор выдаст исключение повышения типа:: bad_weak_ptr и weak_ptr:: блокировка возвратит пустой shared_ptr.

Примечание метод истек (), также скажет Вам, если Ваш ptr будет все еще вокруг.

14
ответ дан 29 November 2019 в 00:17
поделиться

При использовании интеллектуальных указателей (или любой объект управления выделения) Вы рассчитываете на поведения, определенные в конструкторе/деструкторе для управления refs/derefs/locks/unlocks. В результате те типы объектов должны быть истинными объектами работать правильно. при использовании ссылок на такие объекты (или указатели) Вы обходите механизм (и просите wedgie).

5
ответ дан 29 November 2019 в 00:17
поделиться

Существует все еще много случаев, в которых ссылка на интеллектуальный указатель является хорошей идеей. Очевидным примером является метод присвоения самого класса интеллектуального указателя, которые принимают ссылка к другому интеллектуальному указателю как его параметр.

Создание метода, который принимает, ссылка интеллектуального указателя означает, что параметр не увеличивает количество внутренней ссылки интеллектуального указателя. Это может улучшить производительность - но вероятно не много. Кроме того, существует много вещей, которые метод не может сделать со ссылкой - или исходный интеллектуальный указатель. Если Вы знаете то, что эти вещи - и избегают их, передающий ссылкой работает просто великолепно. Конечно, цель интеллектуальных указателей состоит в том, чтобы избежать необходимости знать эти вещи.

кроме того, если у Вас есть метод, который будет , изменяют значение параметра интеллектуального указателя, передавая, поскольку ссылка требуется, как это с любым другим типом.

3
ответ дан 29 November 2019 в 00:17
поделиться

"Умной" частью интеллектуальных указателей управляют конструкторы, деструкторы, операторы присвоения и другие функции класса интеллектуального указателя. При помощи ссылки Вы обходите эти операции - конструктора не вызовут, когда Ваша ссылка будет инициализирована, и деструктор не назовут, когда Ваша ссылка выходит из объема.

В сущности, ссылка на интеллектуальный указатель является немым указателем со всеми рисками и глюками, которые влечет за собой последний.

1
ответ дан 29 November 2019 в 00:17
поделиться

У нас есть изготовленный на заказ smartpointers, и мы всегда делаем привычку к передаче 'константы refsomething &';

это не увеличивает или постепенно уменьшает интеллектуальный указатель, и как таковой - и что еще более важно - звонит в InterLockedIncrement/Decrement, избегаются, который по очереди избегает забор памяти и все вещи, которые идут с этим: блокировка шины, аннулирование кэша...

0
ответ дан 29 November 2019 в 00:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: