Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+期间的SEGFULT+;数组释放_C++_Gdb_G++_Valgrind_Segmentation Fault - Fatal编程技术网

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;istd::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问题。析构函数,复制构造函数,赋值运算符。你提到的第四种方法是什么?我猜也是这样。是的,它失败了。我要找出我在哪里做了错误的事情。是的,就是这样。容器上的
推回
正在复制。注意到了。我要改变方法来解决问题。析构函数、复制构造函数、赋值运算符。您提到的第四种方法是什么?