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
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.
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. ;)
@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...
@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 funkcji

Do tego jesli juz uzywasz Qt to uzywaj smart pointerow. Bedzie to duzo bezpieczniejsze jesli martwisz sie o wycieki pamieci.

deklaracja zmiennej:
QSharedPointer accessToken;

cialo settera:
this->accessToken = QSharedPointer(new QString(token), deleteLater);

funkcja deleteLater

static void deleteLater(QString *token) {
delete
@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ść.