Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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++;对象给我一个错误:未分配要释放的指针_C++_Oop_Pointers - Fatal编程技术网

C++ c++;对象给我一个错误:未分配要释放的指针

C++ c++;对象给我一个错误:未分配要释放的指针,c++,oop,pointers,C++,Oop,Pointers,我试图创建我自己的字符串类只是为了练习,但我遇到了一个问题。 编译程序时,会产生以下错误: “a.out(3013,0x7fff9a0ee3c0)malloc:*对象0x7fff50312ba0的错误:未分配要释放的指针*在malloc\u error\u break中设置断点以调试中止陷阱:6” 当我创建一个新对象时,构造函数调用initialize,然后它进入if条件并尝试删除数组指针,但是charArray尚未初始化为任何对象,那么为什么会发生这种情况呢?我该怎么解决呢 注意:当我尝试在S

我试图创建我自己的字符串类只是为了练习,但我遇到了一个问题。 编译程序时,会产生以下错误:

“a.out(3013,0x7fff9a0ee3c0)malloc:*对象0x7fff50312ba0的错误:未分配要释放的指针*在malloc\u error\u break中设置断点以调试中止陷阱:6”

当我创建一个新对象时,构造函数调用initialize,然后它进入if条件并尝试删除数组指针,但是charArray尚未初始化为任何对象,那么为什么会发生这种情况呢?我该怎么解决呢

注意:当我尝试在String.h中初始化charArray和len时,它会给我以下警告:


警告:非静态数据成员的类内初始化是C++11扩展[-Wc++11扩展]大小\u t len=0

                                  //class String.h

#ifndef String_H
#define String_H
#define MAX_LEN 60000

class String{

private:

    // Variables and array container
    size_t len;
    char *charArr;

    // Private functions
    void initialize();
    void copyString(const char *);

public:
    // Constructors and destructor
    String();
    String(const char *);
    String(const String&);
    ~String();


};

#endif

                                  //String.cpp
#include <iostream>
#include "String.h"
#include <cstring>
using namespace std;

// Constructors
String::String(){

    initialize();
}

String::String(const char *arr){

    copyString(arr);
}

String::String(const String& arr){

    copyString(arr.charArr);
}

String::~String(){

    initialize();
}

// Private functions
void String::initialize(){

    if(charArr != 0){
        delete [] charArr;
    }
    charArr = 0;
    len = 0;
}

void String::copyString(const char *arr){

    if(charArr){
        initialize();
    }
    if(arr){
        size_t tempLen = strnlen(arr, MAX_LEN);
        this->len = (tempLen > MAX_LEN)? MAX_LEN : tempLen;
        this->charArr = new char[len + 1]();
        strncpy((char*)this->charArr, arr, this->len);
    }

}

                                 //Main.cpp
int main(){

    String s1;

    return 0;
}
//class String.h
#ifndef字符串
#定义字符串
#定义最大值60000
类字符串{
私人:
//变量和数组容器
尺寸透镜;
char*charArr;
//私人职能
void初始化();
无效复制字符串(常量字符*);
公众:
//构造函数和析构函数
字符串();
字符串(常量字符*);
字符串(常量字符串&);
~String();
};
#恩迪夫
//String.cpp
#包括
#包括“String.h”
#包括
使用名称空间std;
//建设者
String::String(){
初始化();
}
字符串::字符串(常量字符*arr){
复制字符串(arr);
}
字符串::字符串(常量字符串和arr){
复制字符串(arr.charArr);
}
字符串::~String(){
初始化();
}
//私人职能
无效字符串::初始化(){
如果(charArr!=0){
删除[]字符;
}
charArr=0;
len=0;
}
void String::copyString(const char*arr){
if(charArr){
初始化();
}
如果(arr){
模板尺寸=标准长度(arr,最大长度);
这个->len=(模板>MAX_len)?MAX_len:模板;
这个->字符=新字符[len+1]();
strncpy((char*)this->charArr,arr,this->len);
}
}
//Main.cpp
int main(){
字符串s1;
返回0;
}

当构造函数调用
initialize
时,
charArr
len
的值未定义。因此,它可能会执行一个不需要的
delete[]
,即它试图释放一个未分配的数组。听起来熟悉吗

构造函数应该将成员变量初始化为安全状态

String::String () 
    :   charArr{ nullptr }
    ,   len    { 0       }
{}
通过在
void String::initialize()
函数中未初始化的指针
charArr
上应用运算符进行调用,该函数是从
String::String()构造函数调用的:

delete[] charArr; // undefined behavior because charArr is not initialized
由于此指针不是通过运算符创建的,也不等于
nullptr
,因此尝试删除它会导致未定义的行为。在使用指针/变量之前初始化它们:

String::String() : len(123), charArr(new char[len+1]) {
    initialize();
}

标准中描述该问题的相关段落是:.

在所有构造函数中,您正在比较
charArr
,有时还比较
arr
len
,但它们尚未初始化
c++
不会为您将它们初始化为nullptr或0。即使在此之前,您的默认构造函数也会引用未初始化的
charArr
值。“警告:非静态数据成员的类内初始化是c++11扩展”-因此,请将代码编译为c++11或c++14。不要活在过去;使用现代C++。