C ++对象给了我一个错误:未分配正在释放的指针

c++ object gives me an error: pointer being freed was not allocated

本文关键字:分配 错误 指针 释放 一个 对象      更新时间:2023-10-16

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

"a.out(3013,0x7fff9a0ee3c0( malloc: * 对象 0x7fff50312ba0 的错误:未分配正在释放的指针 * 在malloc_error_break中设置断点以调试中止陷阱:6"。

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

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

警告:非静态数据成员的类内初始化是 C++11 扩展 [-WC++11-扩展] size_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;
}

当构造函数调用initialize时,charArrlen 的值是未定义的。 所以它可能会执行一个不需要的delete[],也就是说,它试图释放一个未分配的数组。听起来很耳熟?

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

String::String () 
    :   charArr{ nullptr }
    ,   len    { 0       }
{}

通过在void String::initialize()String::String() 构造函数调用的未初始化指针上应用运算符 delete[] 来调用未定义的行为charArr

delete[] charArr; // undefined behavior because charArr is not initialized

由于此指针不是通过运算符 new[] 创建的,也不等于 nullptr因此尝试删除它会导致未定义的行为。在使用指针/变量之前对其进行初始化:

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

标准中描述该问题的相关段落是:[expr.delete]#2。