无法在类的析构函数中删除指向数组的成员指针

Posted

技术标签:

【中文标题】无法在类的析构函数中删除指向数组的成员指针【英文标题】:Unable to delete member pointer to array in destructor for class 【发布时间】:2018-03-26 21:49:00 【问题描述】:

所以我试图删除我的成员指针m_memory,因为它指向char 的数组。当我尝试使用delete[] 删除 m_memory 指向的数组时,我最终触发了断点。在使用new 之前,我尝试将m_memory 初始化为nullptr,但它仍然触发了断点。只是想知道我的错误是什么。

头文件:

#ifndef FISH_H
#define FISH_H
#include <iostream>
class Fish 
public:
    Fish(int capacity, std::string name);// Constructor
    Fish(const Fish &other); // Copy Constructor
    ~Fish(); // Destructor
    Fish &operator=(const Fish &other); // Assignment Operator
    void remember(char c); // Remember c
    void forget(); // Clears memory by filling in '.'
    void printMemory() const;// Prints memory
    std::string getName();
protected:
    const char* getMemory() const;// Returns memory
    int getAmount() const; // Returns amount remembered
    int getCapacity() const; // Returns memory capacity
private:
    std::string m_name;
    char * m_memory;
    int m_capacity;
    int m_remembered;
int m_replace;

;
#endif

实现文件:

#include “fish.”

Fish::Fish(int capacity, std::string name) // Constructor
    this->m_capacity = capacity;
    if (capacity > 0) 
        this->m_capacity = capacity;
    
    else 
        this->m_capacity = 3;
    

this->m_name = name;
this->m_memory = new char[this->m_capacity];
this->m_memory[this->m_capacity] = '\0';

for (int i = 0; i < this->m_capacity; i++) 
    this->m_memory[i] = '.';
    
    this->m_remembered = 0;
    this->m_replace = 0;



Fish::~Fish() // Destructor
    
        delete [] this->m_memory; //exception thrown, breakpoint triggered
    

主要:

#include "fish.h"
int main() 
    Fish *nemo = new Fish(3, "nemo");
    nemo->~Fish();


【问题讨论】:

我还想提一下,我尝试删除指针而不添加 this-> 无济于事。 隐约相关:你很少想自己调用析构函数,所以nemo-&gt;~Fish();应该是delete nemo; 我们是否可以假设存在阻止使用 std::string 的限制? 没有。您不必调用析构函数。使析构函数virtual 并通过多态的魔力,无论是在基类还是子类上操作,都会调用正确的析构函数。 显示复制构造函数的代码。这很可能就是问题所在。 【参考方案1】:
this->m_memory = new char[this->m_capacity];
this->m_memory[this->m_capacity] = '\0';

这写在数组之外。 this->m_capacity 为 3,因此您分配 3 个字符,然后写入第 4 个字符。

计算机不需要检测此问题。 Microsoft 正试图通过检测它来提供帮助,但它们的检测仅在您释放内存时才会发生。如果您在调试器中运行程序,您应该会在“调试输出”窗口中看到一些消息,说明程序崩溃的原因。

【讨论】:

所以我想解决方案是让 m_capacity = capacity + 1 以便我可以显式添加“/0”终止字符。我喜欢自己添加空终止字符,因为过去我的数组遇到的问题比我在其中分配的要多,这似乎解决了问题。 该解决方案会阻止断点,还是添加导致断点的空终止字符并阻止我正确使用 delete []? @Hikikomori 你的第二条评论告诉我,我认为你没有理解这个问题。 在数组中放置一个空终止符并不能解决尝试在数组中放置比分配的更多的问题。这意味着您的代码中的其他地方还有其他错误。在填充数组或复制/打印数组时,您可能没有考虑数组的容量。 错误代码在构造函数中,删除空终止字符最终让我删除 [] m_memory 但当我在调试时在本地窗口中查看它时,最终将垃圾附加到 m_memory 数组模式。

以上是关于无法在类的析构函数中删除指向数组的成员指针的主要内容,如果未能解决你的问题,请参考以下文章

C++ 虚拟析构函数 (virtual destructor)

删除指向子类的指针会调用基类析构函数吗?

基类的析构函数写成virtual虚析构函数

虚析构函数与纯虚函数

可扩展散列 - 析构函数 C++

为啥我在这里的析构函数中删除时创建了一个潜在的流浪指针?