Как выпустить указатель от повышения:: shared_ptr?

Проверьте эту ссылку. Я использовал некоторые его другие сообщения к calll WCF сервис с успехом. Обязательно проверьте похожие статьи:

http://encosia.com/2008/05/29/using-jquery-to-directly-call-aspnet-ajax-page-methods/

прочитывает статью, но по существу:

  $("#Result").click(function() {
    $.ajax({
      type: "POST",
      url: "Default.aspx/GetDate",
      data: "{}",
      contentType: "application/json; charset=utf-8",
      dataType: "json",
      success: function(msg) {
        $("#Result").text(msg.d);
      }
    });
});

39
задан ks1322 20 March 2012 в 12:21
поделиться

4 ответа

Вы можете использовать поддельный удалитель. Тогда указатели фактически не будут удалены.

struct NullDeleter {template<typename T> void operator()(T*) {} };

// pp of type some_t defined somewhere
boost::shared_ptr<some_t> x(pp, NullDeleter() );
22
ответ дан 27 November 2019 в 02:33
поделиться

Не делайте этого. Запись в FAQ по Boost:

Q . Почему shared_ptr не предоставляет функцию release ()?

A . shared_ptr b (а); // a.use_count () == b.use_count () == 2 int * p = a.release (); // Кому сейчас принадлежит p? b по-прежнему будет вызывать для него удаление в своем деструкторе.

Кроме того, указатель, возвращаемый функцией release (), будет трудно надежно освободить, так как источник shared_ptr мог быть создан с помощью специального средства удаления.

Таким образом, это было бы безопасно, если это единственный экземпляр shared_ptr, указывающий на ваш объект (когда unique () возвращает true), и объект не требует специального удаления. Я бы все еще сомневался в вашем дизайне, если бы вы использовали такую ​​функцию .release ().

29
ответ дан 27 November 2019 в 02:33
поделиться

Вы можете удалить общий указатель, что мне кажется почти таким же. Если указатели всегда уникальны, хорошим выбором будет std :: auto_ptr <> . Имейте в виду, что уникальные указатели не могут использоваться в контейнерах STL, поскольку операции с ними делают много копирования и временного дублирования.

1
ответ дан 27 November 2019 в 02:33
поделиться

To let the pointer point to nothing again, you can call shared_ptr::reset().

However, this will delete the object pointed to when your pointer is the last reference to the object. This, however, is exactly the desired behaviour of the smart pointer in the first place.

If you just want a reference that does not hold the object alive, you can create a boost::weak_ptr (see boost documentation). A weak_ptr holds a reference to the object but does not add to the reference count, so the object gets deleted when only weak references exist.

4
ответ дан 27 November 2019 в 02:33
поделиться
Другие вопросы по тегам:

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