C++ C+期间的SEGFULT+;数组释放
我在内存释放方面遇到了一个奇怪的问题 我有下面的类内存分区代码:C++ C+期间的SEGFULT+;数组释放,c++,gdb,g++,valgrind,segmentation-fault,C++,Gdb,G++,Valgrind,Segmentation Fault,我在内存释放方面遇到了一个奇怪的问题 我有下面的类内存分区代码: #include <cstring> #include <iostream> #include "memorypartition.h" MemoryPartition::MemoryPartition(int maxSize) { this->partitionArray = new char[maxSize]; memset(this->partitionArray, ((
#include <cstring>
#include <iostream>
#include "memorypartition.h"
MemoryPartition::MemoryPartition(int maxSize) {
this->partitionArray = new char[maxSize];
memset(this->partitionArray, ((int) '$'), maxSize);
this->maxSize = maxSize;
this->isFree = true;
}
MemoryPartition::~MemoryPartition() {
delete[] this->partitionArray;
this->partitionArray = NULL;
maxSize = 0;
}
void MemoryPartition::setFree(bool isFree) {
this->isFree = isFree;
}
bool MemoryPartition::getFree() {
return this->isFree;
}
int MemoryPartition::getMaxSize() {
return this->maxSize;
}
void MemoryPartition::getPartitionArray() {
for(int i = 0;i < maxSize;i++) {
std::cout << partitionArray[i] << ' ';
}
std::cout << std::endl;
}
#包括
#包括
#包括“memorypartition.h”
MemoryPartition::MemoryPartition(int maxSize){
此->分区数组=新字符[maxSize];
memset(this->partitionArray,((int)“$”),maxSize);
此->最大尺寸=最大尺寸;
这->isFree=true;
}
MemoryPartition::~MemoryPartition(){
删除[]此->分区数组;
此->partitionArray=NULL;
maxSize=0;
}
void MemoryPartition::setFree(bool isFree){
此->isFree=isFree;
}
bool MemoryPartition::getFree(){
返回此->isFree;
}
int MemoryPartition::getMaxSize(){
返回此->最大尺寸;
}
void MemoryPartition::getPartitionArray(){
对于(int i=0;i std::cout从上面的代码不可能分辨出来
但我的猜测是,您需要定义复制构造函数和赋值运算符
参见第4条规则(谷歌/维基it)
请尝试以下操作:
class MemoryPartition
{
// Just add these two lines (keep them private)
MemoryPartition(MemoryPartition const&); // Don't define.
MemoryPartition& operator=(MemoryPartition const&); // Don't define.
<CLASS STUFF AS BEFORE>
};
类内存分区
{
//只需添加这两行(保持它们的私密性)
MemoryPartition(MemoryPartition常量&);//不定义。
MemoryPartition&operator=(MemoryPartition常量&);//不定义。
};
现在编译代码。如果由于上面的代码是私有的而失败,那么您意外地在某个地方复制了该对象,并且正在对指针执行双重删除操作。从上面的代码无法判断
但我的猜测是,您需要定义复制构造函数和赋值运算符
参见第4条规则(谷歌/维基it)
请尝试以下操作:
class MemoryPartition
{
// Just add these two lines (keep them private)
MemoryPartition(MemoryPartition const&); // Don't define.
MemoryPartition& operator=(MemoryPartition const&); // Don't define.
<CLASS STUFF AS BEFORE>
};
类内存分区
{
//只需添加这两行(保持它们的私密性)
MemoryPartition(MemoryPartition常量&);//不定义。
MemoryPartition&operator=(MemoryPartition常量&);//不定义。
};
现在编译代码。如果因为上面的内容是私有的而失败,那么您意外地在某个地方复制了对象,并且正在对指针执行双重删除操作。问题不在该代码中。将代码张贴到使用MemoryPartition的位置,也许我们可以帮助您。也许您需要定义复制构造函数并复制赋值运算符?问题一定发生在其他地方。Valgrind是否报告任何堆损坏?您是否在其他地方分配/取消分配partitionArray
实际上,当我注释delete[]行时,问题不再出现。无论如何,我也要发布您问到的代码。((int)“$”)
应该是static\u cast(“$”)
。您不必在完成后将指针设置为NULL
。无论如何,如果您在dtor中,您将无法再使用指针(因此很明显,在代码复查中,任何使用它的代码都是错误的)。与maxSize=0
相同。你也应该使用size\u t
来表示你的大小,而不是int。问题不在代码中。在使用MemoryPartition的地方张贴代码,也许我们可以帮你。也许你需要定义复制构造函数和复制赋值运算符?问题一定发生在其他地方。是吗Valgrind报告堆损坏了吗?是否在其他地方分配/取消分配分区数组
事实上,当我注释delete[]行时,问题就不再出现了。无论如何,我也会发布你问的代码。((int)$)
应该是静态转换('$'))
。完成后,您不必将指针设置为NULL
。不管怎样,如果您在dtor中,您将无法再使用指针(因此,很明显,在代码审查中,任何使用它的代码都是错误的)。与maxSize=0
相同。你也应该使用size\u t
来表示你的大小,而不是int。我猜也是这样。是的,它失败了。我要找出我在哪里做了错误的事情。是的,就是这样。容器上的推回
正在制作副本。刚刚注意到。我要改变方法到solv问题。析构函数,复制构造函数,赋值运算符。你提到的第四种方法是什么?我猜也是这样。是的,它失败了。我要找出我在哪里做了错误的事情。是的,就是这样。容器上的推回正在复制。注意到了。我要改变方法来解决问题。析构函数、复制构造函数、赋值运算符。您提到的第四种方法是什么?