утечка памяти с ++ или нет - PullRequest
0 голосов
/ 09 февраля 2012

у меня есть код:

class foo
{
public:
  bar(const QString& s){}
.....
};

int main()
{
 .....
 foo f;
 for(int i = 0; i < 100; i++)
     f.bar(QString("%1").arg(i));
 ....
 return 0;
}

У меня утечка памяти в строке "f (QString (" некоторый текст строки? "));" или нет?

Другой пример

class foo
{
  QUdpSocket socket;
public:
  foo();  
  void send_msq();
};

foo::foo(){
  socket.bind(QHostAddress("192.168.20.1"),50501);
}

void send_msq()
{
  socket.writeDatagram(...);
}

У меня возникла проблема со строкой "socket.bind (QHostAddress (" 192.168.20.1 "), 50501);"

1 Ответ

1 голос
/ 09 февраля 2012

Нет утечки памяти.Класс QString управляет собственной памятью (при условии, что вы говорите об этом QString.

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

В общем, пока ваши ресурсы управляются классами, а вы не выделяете их с помощью new, вам не нужно беспокоиться об освобождении ресурсов, так как деструктор будет запускаться, когда экземпляр класса выходит из области видимости.

Когда вы используете new или используете ресурс, время жизни которого не управляетсяклассом (например, память, возвращаемая malloc или файлом, возвращаемым fopen (в отличие от fstream, который является классом и очищается при его уничтожении)), именно тогда вам нужно обязательно очистить

Между прочим, лучший способ сделать это - обернуть такие ресурсы в класс, который управляет временем жизни ресурса через конструктор и деструктор, а затем использовать этот класс вместо этого.«сырого» ресурса;это называется шаблоном Resource Acquisition Is Initialization .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...