Aşağıdaki kodu düşünün:İşaretçiyi değiştirmenin daha idiomatik bir yolu var mı?
#include <memory>
#include <stdio.h>
#include <stdexcept>
class Foo {
public:
Foo(int n) { val =n; printf("Hi %d\n", val); };
~Foo() { printf("Bye %d\n", val); };
private:
int val;
};
int main()
{
std::shared_ptr<Foo> p = nullptr; // I don't know what I want yet
p = std::make_shared<Foo>(1); // OK, I've decided
// I've changed my mind, it needs to be something else
p = nullptr;
p = std::make_shared<Foo>(2);
return 0;
}
Onun çıkışı:
Hi 1
Bye 1
Hi 2
Bye 2
Bu yapmacık bir örnek. Foo oldukça ilgi çekicidir. Sadece ömrü ile ilgili bilgi yazdırır.
Kodun arkasındaki mantık şudur: p bildiriyorum, ancak başlangıçta ne gerektiğini bilmiyorum. Sonra ne olduğunu bildiğime karar veririm: 1. değeri almalıdır. Gerçek kodumda bu değer uzun sürebilir.
Bir süre sonra, bunun 1 olmamasına, 2 olması gerektiğine ben karar veririm. Daha önce ne olursa olsun, imha edilmeli ve başka bir şeyle değiştirilmelidir.
Şimdiye kadar, benim anlayışım yukarıdaki kodun bellek yönetimi açısından iyi ve istisnalar altında sağlam olmasıdır.
demenin daha deyimsel yolu var mı:
p = nullptr;
p = std::make_shared<Foo>(2);
elimden önce sahip tahrip edilmesi gerektiğini söylemek istiyorum çünkü ben sadece son satırı yazamazsınız.
_ ile yeni paylaşır. _ "Son satırı yazamam, çünkü daha önce elimden gelenin daha önce yok edilmesini istiyorum." _ Sadece ikinci çizgiyi düşünmenizi sağlayan şey nedir? 'nullptr' atamaktan başka eski değerin yıkımını tetiklemez mi? –
Çünkü "p = nullptr" konusunu açıkladığım zaman, Hi 1, Merhaba 2, Hoşçakal 1, Hoşçakal 2. çıkışını elde ediyorum. IOW, ilk ödev çok uzun sürüyor. – blippy
Bunun nedeni, ** 2 ** nesnesinin, atamadan önce "p" olarak oluşturulmasıdır. Eğer ** 1 ** nesnesine gerçekten ihtiyaç duyarsanız, ** 2 ** oluşturulduğunda ** 2 ** oluşturmadan önce 'p'' nullptr '' i ayarlamanız gerekir. Bunun için bir deyim yoktur, çünkü bu zor bir gerekliliktir. – Motti