c ++对象给我一个错误:没有分配被释放的指针

时间:2017-12-31 17:54:14

标签: c++ oop pointers

我正在尝试创建自己的String类,仅用于练习,但我遇到了问题。 当我编译程序时,它会产生以下错误:

" a.out(3013,0x7fff9a0ee3c0)malloc: *对象0x7fff50312ba0错误:未释放指针* 在malloc_error_break中设置断点以调试Abort陷阱:6&#34 ;

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

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

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

2 个答案:

答案 0 :(得分:3)

构造函数调用null时,initializecharArr的值未定义。因此它可能会执行不需要的len,也就是试图释放未分配的数组。听起来很熟悉?

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

delete[]

答案 1 :(得分:1)

您通过在charArr函数中的未初始化指针void String::initialize()上应用运算符undefined behaviour来调用delete[],该函数是从String::String()函数调用的1}}构造函数:

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

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

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

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