Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 取消分配继承,C++; ostream&operator_C++ - Fatal编程技术网

C++ 取消分配继承,C++; ostream&operator

C++ 取消分配继承,C++; ostream&operator,c++,C++,如果我读对了代码,因为格式有点不正确,那么问题很可能是您的stock copy构造函数执行浅拷贝,而同一类的赋值操作符执行深拷贝。通过阅读代码的其余部分,我假设您打算制作一个深度副本,而不仅仅是复制m_名称和m_符号指针 我还强烈建议您使用std::string而不是原始的字符指针——首先这样做可以避免我上面描述的问题。它还允许您使用编译器生成复制构造函数、赋值运算符和析构函数。代码越少越好。当您发布代码时,格式出现问题,所以我不得不将其移动到外部编辑器阅读 问题不是内存泄漏,而是您未能回收的内

如果我读对了代码,因为格式有点不正确,那么问题很可能是您的stock copy构造函数执行浅拷贝,而同一类的赋值操作符执行深拷贝。通过阅读代码的其余部分,我假设您打算制作一个深度副本,而不仅仅是复制m_名称和m_符号指针


我还强烈建议您使用std::string而不是原始的字符指针——首先这样做可以避免我上面描述的问题。它还允许您使用编译器生成复制构造函数、赋值运算符和析构函数。代码越少越好。

当您发布代码时,格式出现问题,所以我不得不将其移动到外部编辑器阅读

问题不是内存泄漏,而是您未能回收的内存。这是完全相反的问题。在这里,您试图回收已经释放的内存

我敢打赌,析构函数中失败的delete调用发生在使用复制构造函数或第二个重载赋值运算符复制或填充的对象上。您正在这些位置执行浅复制,导致两个库存对象为其mname和msymbol成员引用完全相同的内存。两个文件中的任何一个(如果您多次复制,则会有多个)首先被销毁都不会有问题。第二个被摧毁的都会失败

我还做了如下观察:构造函数仔细检查符号和名称,看它们是否实际引用了任何数据。只有这样,您才能继续使用它们的值。如果它们为null,则为相应的成员分配null值。另一方面,第一个重载赋值运算符正在复制一个stock实例,据您所知,该实例可能具有null mname或msymbol成员。您应该像对待构造函数一样小心对待这些值,并在使用前对其进行测试。

问题在于:

ostream& operator<<(ostream& out, const hashmap& h)
{
const char *getSymbol = NULL;
h.hashTable->displayHeaders(out);
for ( int hashIndex = 0; hashIndex < maxSize; hashIndex++ )
{   
    getSymbol = h.hashTable[hashIndex].getSymbol();
    if ( getSymbol )    
    {
        out << h.hashTable[hashIndex];
    }
}   
return out;
}
看看这个运算符和您声明的另一个赋值运算符的逻辑:您以不同的方式复制m_符号和m_名称

最好只定义一次赋值运算符:

stock& stock::operator=(stock const * const s)

如果你愿意,也可以换一种方式,但请记住,此版本的实现已关闭。

我甚至看不到我的编辑。你到底为什么要编辑你的内容?事实上,问题不在他们。
stock& stock::operator=(stock const * const s)
{
  return this->operator=(*s);
}