Wpis z mikrobloga

Hej mirki z #programowanie czy taki sposób ustawiania zmiennych jest poprawny?

void A::setAccessToken(QString &accessToken) {
if (m_accessToken)
delete m_accessToken;
m_accessToken = new QString(accessToken);
}

Czy to też będzie działać bez wycieków pamięci?

void QwgAPI::setAccessToken(QString &accessToken) {
m_accessToken = new QString(accessToken);
}

Metoda oczywiście jest publiczna i może zostać wywołana wiele razy. #qt #pytanie
  • 10
  • Odpowiedz
  • 1
Przekazujesz referencje do obiektu wiec nie uzywaj operatorow new i delete. Je sie uzywa w odniesieniu do wskaznikow na obiekty
  • Odpowiedz
qt chyba jakas swoją wersję unique_ptr ma, użyj tego.
a, i jak nie modyfikujesz oryginału to const& zamiast samego &.

@seam: on chyba specjalnie kopie robi.
  • Odpowiedz
Chociaz nie wiem czy jest sens trzymac wskaznik do obiektu string (jakikolwiek by on nie byl). Trzymalbym go jako member'a (wartosc) po prostu i kopiowal. Byloby prosciej, czysciej, bez zbednych alokacji.
  • Odpowiedz
Anyway, jezeli juz musisz trzymac to jako wskaznik, to faktycznie wykorzystaj jakis smart pointer typu unique. Chociaz moim zdaniem narobisz sobie dodatkowych problemow przez takie podejscie. ;)
  • Odpowiedz
@TheNewIcek: to chyba zboczenie z C i ASMa dla mikrokontrolerów, gdzie każdy bajt się liczy. ʕʔ Po prostu wskaźnik zawsze zajmie te 4 bajty, a zmienna typu złożonego zajmie trochę więcej. Wydaje mi się to logicznym podejściem w klasie, gdzie niektóre z pól są opcjonalne...
  • Odpowiedz
@RARvolt
Jesli juz tak bardzo chcesz przekazywac referencje do obiektu, zeby nie tworzyc lokalnych zmiennych to chociaz zrob prototyp w stylu

void setAccessToken(const QString &token)

Zeby ten token przekazany byl niezmienny w
  • Odpowiedz
@kalectwo: ja bym to nawet nazwał kalectwem (umysłowym) ;)

Po prostu wskaźnik zawsze zajmie te 4 bajty, a zmienna typu złożonego zajmie trochę więcej.


@RARvolt: gówno prawda. Dodatkowo QString zawiera tylko wskaźnik więc zajmuje tyle samo (korzystają z pimpl).

nagie new i delete w kodzie to antyidiom w nowoczesnym C++. Jak *musisz* mieć "opcjonalną" wartość - Boost.Optional lub jakiś smart wskaźnik. W przeciwnym wypadku: trzymaj QString przez wartość.
  • Odpowiedz