内存泄漏-C++; 我需要一些帮助来找到我的C++代码中的内存泄漏。我尝试将这些行放入构造函数中,但由于构造函数中的第2行和第3行,这会导致内存泄漏: Myclass::Myclass() { ACE_Time_Value tm = ACE_OS::gettimeofday(); m_obj.firstStr() = tm.sec(); m_obj.secondStr() = tm.usec(); }

内存泄漏-C++; 我需要一些帮助来找到我的C++代码中的内存泄漏。我尝试将这些行放入构造函数中,但由于构造函数中的第2行和第3行,这会导致内存泄漏: Myclass::Myclass() { ACE_Time_Value tm = ACE_OS::gettimeofday(); m_obj.firstStr() = tm.sec(); m_obj.secondStr() = tm.usec(); },c++,memory-leaks,C++,Memory Leaks,这里,firstStr()和secondStr()都是在另一个类中返回std::string&的方法 有没有关于内存泄漏取决于什么的建议?我不确定这两行是否是内存泄漏的真正原因,但Valgrind指出了这两行,我不知道如何找到泄漏。我不是ACE方面的专家,但似乎tm.sec()不太可能返回字符串,更可能返回整数(事实上,它返回了一个长字符串)。在这种情况下,当您调用函数并为其赋值时,实际上是在调用字符串的赋值运算符,该运算符为字符串指定一个字符(以长字符编码)。这几乎肯定不是您想要的,但它不应该

这里,
firstStr()
secondStr()
都是在另一个类中返回
std::string&
的方法


有没有关于内存泄漏取决于什么的建议?我不确定这两行是否是内存泄漏的真正原因,但Valgrind指出了这两行,我不知道如何找到泄漏。

我不是ACE方面的专家,但似乎tm.sec()不太可能返回字符串,更可能返回整数(事实上,它返回了一个长字符串)。在这种情况下,当您调用函数并为其赋值时,实际上是在调用字符串的赋值运算符,该运算符为字符串指定一个字符(以长字符编码)。这几乎肯定不是您想要的,但它不应该导致内存泄漏

换句话说,您正在有效地执行以下操作:

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

但不会泄漏内存。

我不是ACE方面的专家,但似乎tm.sec()不太可能返回字符串-更可能返回整数(事实上,它返回了一个长字符串)。在这种情况下,当您调用函数并为其赋值时,实际上是在调用字符串的赋值运算符,该运算符为字符串指定一个字符(以长字符编码)。这几乎肯定不是您想要的,但它不应该导致内存泄漏

换句话说,您正在有效地执行以下操作:

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

但是不会泄漏内存。

如果您使用的是任何内存泄漏检测器(仍然可疑),那么下一个最好的方法是在调试构建中重载new和delete操作符,并记录所有内存分配和释放

如果您正在使用任何内存泄漏检测器(仍然可疑),那么下一个最好的方法是在调试构建中重载new和delete操作符,并记录所有内存分配和释放

我想什么时候

 ACE_Time_Value tm = ACE_OS::gettimeofday();
被称为空间字符串

并分配给第一个和第二个字符串 但当构造函数完成时,会调用ACE_Time_Value析构函数,从而删除分配的字符串

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

试图应对这些价值观。防止泄漏。

我想什么时候

 ACE_Time_Value tm = ACE_OS::gettimeofday();
被称为空间字符串

并分配给第一个和第二个字符串 但当构造函数完成时,会调用ACE_Time_Value析构函数,从而删除分配的字符串

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


试图应对这些价值观。防止泄漏。

对象.method()=一些字符串语法似乎很奇怪/违反直觉。您能提供这些方法的定义吗?它们只返回类的受保护属性,并且都是std::string类型。string&firstStr(){return attr1;}等等。m_obj.firstStr()和secondStr()是否返回指针?如果是这样,则将一些整数值赋给指向字符串的指针副本(假设tm.sec()和tm.usec()返回long)。无论如何,我猜您的问题与这样一个事实有关:您将tm的值分配给firstStr()和secondStr()返回的任何内容的副本(引用字符串?)。您确定您的编译器没有抱怨任何其他问题吗?另一个问题:再次假设sec()和usec()提供整数值,您是否检查了字符串是否包含预期值?我不能在std::string中长时间地考虑运算符重载。如果字符串包含正确的值,那么一定是某个地方出现了重载,可能是那里发生了泄漏。我猜Valgrind指向这些行,因为您将long int指定给字符串&。我想知道,你想实现什么,以及那里到底发生了什么语法似乎很奇怪/违反直觉。您能提供这些方法的定义吗?它们只返回类的受保护属性,并且都是std::string类型。string&firstStr(){return attr1;}等等。m_obj.firstStr()和secondStr()是否返回指针?如果是这样,则将一些整数值赋给指向字符串的指针副本(假设tm.sec()和tm.usec()返回long)。无论如何,我猜您的问题与这样一个事实有关:您将tm的值分配给firstStr()和secondStr()返回的任何内容的副本(引用字符串?)。您确定您的编译器没有抱怨任何其他问题吗?另一个问题:再次假设sec()和usec()提供整数值,您是否检查了字符串是否包含预期值?我不能在std::string中长时间地考虑运算符重载。如果字符串包含正确的值,那么一定是某个地方出现了重载,可能是那里发生了泄漏。我猜Valgrind指向这些行,因为您将long int指定给字符串&。我想知道,你想实现什么,以及那里到底发生了什么。ACE_Time_值不包含字符串,调用它的函数返回longs.Thx以获得快速响应,但是你能不能更详细地解释一下你的解决方案?Thx。当构造函数的作用域结束时,在构造函数中生成的tm也会结束。tm的析构函数被调用,作用域结束。而到了时代是指也死了。而且m_obj不在构造函数的范围内,因此,当m_obj在cons之外构建后,它会指出一些被删除或取消引用的内容,从而导致泄漏。@Neil想详细说明一下,还是你打算让那些无用的评论挂在那里?@将看到我的第一条评论。它不是无用的,它向OP表明这个应答者不知道他在说什么。ACE_Time_值不包含字符串,调用它的函数返回longs.Thx以快速响应