我正在尝试创建自己的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;
}
答案 0 :(得分:3)
构造函数调用null
时,initialize
和charArr
的值未定义。因此它可能会执行不需要的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。