无法为 object 数组删除读取内存

Unable to read memory for object array deletion

所以我正在用 C++ 测试一些 object 数组,然后我试图删除这些 objects,正如我应该做的那样。

但这就是问题所在:deleteInputPattern 变量工作正常,因此我能够在 CSVFile header class 中完全删除 "inputs",但它在主文件中的等价物, "inputArray",触发断点。

这里有什么问题?我要删除 non-existent 内存吗?是否需要任何指针

下方代码墙:

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 constructor\n");
}

InputTest::~InputTest()
{
    printf("Input destructor\n");
}

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: %.2f\n", r);
    printf("G: %.2f\n", g);
    printf("B: %.2f\n", b);
    printf("T: %.2f\n", t);
}

Copy.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 constructor\n");
    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 destructor\n");
}

InputTest * Copy::getInputPattern(int index)
{
    printf("input gotten: %d\n", index);
    return inputs[index];
}

void Copy::addInputPattern(InputTest * in)
{
    inputs[patternCount] = in;
    patternCount++;
    printf("input added: %d\n", 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("next\n");
    }

    for (count = 0; count < 3; count++)
    {
        printf("round %d\n", count);
        printf("R: %f\n", inputArray[count]->getR());
        printf("G: %f\n", inputArray[count]->getG());
        printf("B: %f\n", inputArray[count]->getB());
        printf("T: %f\n", 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,但不能同时调用两者。我可以推荐 2 个最佳实践:

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