无法读取内存以删除对象数组
Unable to read memory for object array deletion
所以我正在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,但不能同时调用两者。我可以推荐两种最佳实践:
- 使用智能指针
- 分配模块应该删除内存(这可能不适用于许多情况,例如工厂)
相关文章:
- 迭代时从向量和内存中删除对象
- C++从对象自己的类中删除对象
- 如何通过对象的类属性删除对象,并返回其对象值?
- 删除对象(具有不同类型)的引用时会发生什么情况?
- 从列表C++中删除对象
- c++ 循环访问对象列表并删除对象
- 从对象本身的容器中删除对象
- 从尝试引用已删除函数的矢量 C++ 中删除对象
- 如何通过指向元组的共享指针删除对象
- 防止通过接口删除对象
- 在 c++ 中从内存中删除对象
- 当对象被删除时,复制被删除对象的对象如何
- 当我使用dynamic_cast并删除对象删除时,析构函数是如何工作的?
- 从内存中删除对象
- 通过C++中的删除方法自行删除对象
- C++ - 析构函数只是释放内存还是实际删除对象
- 如何通过存储在 std::list 中的指针删除对象?
- 如何通过对象参数从指针矢量中删除对象和指针
- 我可以删除对象的右值版本的函数吗?
- 使用对象的索引从矢量中删除对象