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