утечка памяти - C ++ - PullRequest
       3

утечка памяти - C ++

0 голосов
/ 09 августа 2010

Мне нужна помощь, чтобы найти утечку памяти в моем коде C ++.Я пытаюсь поместить эти строки в свой конструктор, но это вызывает утечку памяти из-за строк 2 и 3 в конструкторе:

Myclass::Myclass()
{
  ACE_Time_Value tm = ACE_OS::gettimeofday();

  m_obj.firstStr() = tm.sec();
  m_obj.secondStr() = tm.usec();
}

Здесь firstStr() и secondStr() - оба метода, которые возвращают std::string& в другом классе.

Есть предложения, от чего зависит утечка памяти?Я не уверен, являются ли эти две строки фактической причиной утечки памяти, но Valgrind указывает на эти две строки, и я не знаю, как найти утечку.

Ответы [ 3 ]

4 голосов
/ 09 августа 2010

Я не эксперт по ACE, но маловероятно, что tm.sec () возвращает строку - гораздо более вероятно, что он возвращает целое число (на самом деле это так - он возвращает длинное). В этом случае, когда вы вызываете свои функции и присваиваете им, вы, по сути, вызываете оператор присваивания строки, который присваивает строку один символ (закодированный в длинном). Это почти наверняка не то, что вы хотите, но это не должно вызывать утечку памяти.

Другими словами, вы эффективно делаете это:

int main() {
    string s = "foobar";
    cout << s << endl;
    s = 65L;
    cout << s << endl;
}

который печатает:

foobar
A

но не пропускает память.

0 голосов
/ 09 августа 2010

Я думаю, когда

 ACE_Time_Value tm = ACE_OS::gettimeofday();

называется пробел, строка выделяется

и присваивается первой и второй строке Но когда конструктор готов, вызывается деструктор ACE_Time_Value, который удаляет выделенную строку.

Но они все еще ссылаются на первую и вторую строку. Отсюда и утечка.

Попытка копирования значений. чтобы предотвратить утечку.

0 голосов
/ 09 августа 2010

Если вы используете какие-либо детекторы утечки памяти (и все еще подозрительные), то следующий лучший способ - это перегрузить ваш оператор new и delete в вашей отладочной сборке и записать все ваши выделения памяти и освобождения. Одна возможная помощь

...