无法读取内存以删除对象数组

Unable to read memory for object array deletion

本文关键字:删除 对象 数组 内存 读取      更新时间:2023-10-16

所以我正在C++中测试一些对象数组,然后我试图删除这些对象,就像我应该做的那样。

但问题是:deleteInputPattern变量运行良好,因此我可以完全删除CSVFile头类中的"inputs",但它在主文件"inputArray"中的等价项会触发断点。

这里有什么问题?我正在尝试删除不存在的内存吗?有指针需要吗

下方代码墙:

InputTest.h:

#pragma once
class InputTest
{
    private:
        float r;
        float g;
        float b;
        float t;
    public:
        InputTest();
        ~InputTest();
        InputTest(float r, float g, float b, float t);
        void setR(float newT);
        float getR();
        void setG(float newT);
        float getG();
        void setB(float newT);
        float getB();
        void setT(float newT);
        float getT();
        void print(int count);
};

InputTest.cpp:

#include "InputTest.h"
#include <stdio.h>
InputTest::InputTest()
{
    printf("Input constructorn");
}
InputTest::~InputTest()
{
    printf("Input destructorn");
}
InputTest::InputTest(float r, float g, float b, float t)
{
    this->r = r;
    this->g = g;
    this->b = b;
    this->t = t;
}
void InputTest::setR(float newT)
{
    r = newT;
}
float InputTest::getR()
{
    return r;
}
void InputTest::setG(float newT)
{
    g = newT;
}
float InputTest::getG()
{
    return g;
}
void InputTest::setB(float newT)
{
    b = newT;
}
float InputTest::getB()
{
    return b;
}
void InputTest::setT(float newT)
{
    t = newT;
}
float InputTest::getT()
{
    return t;
}
void InputTest::print(int count)
{
    printf("R: %.2fn", r);
    printf("G: %.2fn", g);
    printf("B: %.2fn", b);
    printf("T: %.2fn", t);
}

副本.h:

#pragma once
class InputTest;
class Copy
{
    private:
        int patternCount;
        InputTest** inputs;
    public:
        Copy();
        ~Copy();
        InputTest* getInputPattern(int index);
        void addInputPattern(InputTest* in);
        void deleteInputPattern();
};

Copy.cpp:

#include "Copy.h"
#include "InputTest.h"
#include <string.h>
#include <stdio.h>
Copy::Copy()
{
    printf("CSV File constructorn");
    inputs = NULL;
    patternCount = 0;
    inputs = new InputTest*[3];
    int i;
    for (i = 0; i < 3; i++)
    {
        inputs[i] = new InputTest();
    }
}
Copy::~Copy()
{
    printf("CSV File destructorn");
}
InputTest * Copy::getInputPattern(int index)
{
    printf("input gotten: %dn", index);
    return inputs[index];
}
void Copy::addInputPattern(InputTest * in)
{
    inputs[patternCount] = in;
    patternCount++;
    printf("input added: %dn", patternCount);
}
void Copy::deleteInputPattern()
{
    int i;
    for (i = 0; i < patternCount; i++)
    {
        delete inputs[i];
    }
    delete inputs;
    inputs = NULL;
}

main.cpp:

#include "Copy.h"
#include "InputTest.h"
#include <string.h>
#include <stdio.h>
int main(int argv, char** argc)
{
    bool testResult = false;
    Copy *test = NULL;
    test = new Copy();
    InputTest **inputArray;
    inputArray = new InputTest*[3];
    int count;
    for (count = 0; count < 3; count++)
    {
        inputArray[count] = new InputTest();
        inputArray[count]->setR(0.2f);
        inputArray[count]->setG(0.6f);
        inputArray[count]->setB(0.8f);
        inputArray[count]->setT(0.5f);
        test->addInputPattern(inputArray[count]);
        inputArray[count] = test->getInputPattern(count);
        printf("nextn");
    }
    for (count = 0; count < 3; count++)
    {
        printf("round %dn", count);
        printf("R: %fn", inputArray[count]->getR());
        printf("G: %fn", inputArray[count]->getG());
        printf("B: %fn", inputArray[count]->getB());
        printf("T: %fn", inputArray[count]->getT());
    }
    test->deleteInputPattern();
    for (count = 0; count < 3; count++)
    {
        delete inputArray[count];
    }
    delete inputArray;
    delete test;
    inputArray = NULL;
    test = NULL;
    return testResult;
}

这些似乎是有问题的行:

test->deleteInputPattern();
for (count = 0; count < 3; count++)
{
    delete inputArray[count];
}

由于您已经使用test->deleteInputPattern()进行了删除,因此该内存将被释放。现在,您正在使用delete inputArray显式地在main中删除相同的对象(您仍然通过inputArray持有对其的引用)。但是该内存已经在deleteInputPattern中被删除,因此您应该会遇到内存访问错误。

您只需要释放一次已分配的内存。没有必要在main()中再次执行此操作。在main中显式调用deleteInputPattern或delete,但不能同时调用两者。我可以推荐两种最佳实践:

  1. 使用智能指针
  2. 分配模块应该删除内存(这可能不适用于许多情况,例如工厂)