【问题标题】:memory leak - C++内存泄漏 - C++
【发布时间】:2010-08-09 12:49:10
【问题描述】:

我需要一些帮助来查找我的 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 指向这两行,我不知道如何找到泄漏。

【问题讨论】:

  • object.method() = some_string; 语法看起来很奇怪/违反直觉。你能提供这些方法的定义吗?
  • 它们只是返回类的受保护属性,并且都是 std::string 类型。 std::string& firstStr() { return attr1;} 等等。
  • m_obj.firstStr() 和 secondStr() 是否返回指针?如果是这样,您正在为指向字符串的指针的副本分配一些整数值(假设 tm.sec() 和 tm.usec() 正在返回长整数)。无论如何,我想您的问题与您将 tm 的值分配给 firstStr() 和 secondStr() 返回的任何内容的副本(引用字符串?)有关。你确定你的编译器没有抱怨别的吗?
  • 另一个问题:再次假设 sec() 和 usec() 提供整数值,您是否检查过您的字符串是否包含预期值?我无法在 std::string 中长时间考虑运算符重载。如果您的字符串包含正确的值,则某处一定有过载,可能泄漏发生在那里。
  • 我猜 Valgrind 指向这些行,因为您将 long int 分配给 string&。我想知道,你想达到什么目标以及那里到底发生了什么。

标签: c++ memory-leaks


【解决方案1】:

我不是 ACE 方面的专家,但 tm.sec() 返回字符串似乎不太可能——它更可能返回一个整数(实际上它确实如此——它返回一个长整数)。在这种情况下,当您调用函数并分配给它们时,您实际上是在调用字符串的赋值运算符,它将单个字符(以长编码形式编码)分配给字符串。这几乎肯定不是您想要的,但它不会导致内存泄漏。

换句话说,您实际上是在这样做:

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

哪个打印:

foobar
A

但不会泄漏内存。

【讨论】:

  • 不知道分配给这样的字符串是有效的。 +1。
【解决方案2】:

如果您正在使用任何内存泄漏检测器(并且仍然值得怀疑),那么下一个最佳方法是在调试构建中重载 new 和 delete 运算符并记录所有内存分配和释放。 One possible help

【讨论】:

    【解决方案3】:

    我想当

     ACE_Time_Value tm = ACE_OS::gettimeofday();
    

    被称为空间字符串被分配

    并分配给第一个和第二个字符串 但是当构造函数完成时,ACE_Time_Value 析构函数被调用,它删除了分配的字符串。

    但他们仍然引用第一个和第二个字符串。 因此泄漏。

    尝试应对价值观。防止泄漏。

    【讨论】:

    • ACE_Time_Value 不包含字符串,调用它的函数返回longs。
    • 谢谢您的快速回复,但您能否详细解释一下您的解决方案?谢谢。
    • 当构造函数的作用域结束时,构造函数中的 tm 也结束。并调用 tm 的析构函数并结束作用域。而到了时代是分也死了。并且 m_obj 超出了构造函数的范围,因此,当在 cons 之外构造 m_obj 之后,它会指向一些已删除或取消引用的内容,从而导致泄漏。
    • @Neil 想详细说明一下,还是你打算让那些无用的评论在那里闲逛?
    • @将看到我的第一条评论。而且它不是没用的,它向 OP 表明这个回答者不知道他在说什么。
    猜你喜欢
    • 2016-01-27
    • 2010-11-11
    • 2017-02-18
    • 2015-11-19
    • 2014-11-01
    • 2020-03-31
    • 2016-03-15
    • 2015-07-25
    • 2018-01-03
    相关资源
    最近更新 更多