C ++对象给了我一个错误:未分配正在释放的指针
c++ object gives me an error: pointer being freed was not allocated
我正在尝试创建自己的字符串类只是为了练习,但我遇到了一个问题。当我编译程序时,它会产生以下错误:
"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
时,charArr
和 len
的值是未定义的。 所以它可能会执行一个不需要的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。
相关文章:
- vector.resize()中的分配错误
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 如何处理以下代码中的内存分配错误
- 动态内存分配错误
- C++向量上的分配错误
- libtorrent file_storage无效:分配错误
- 数组大小分配错误
- 只读位置'__result.std::_Rb_tree_const_iterator<_Tp>::operator*<long long int>()'分配错误
- C++ 内存分配错误?
- 具有特征成员变量分类和分配错误的C 类
- 为什么这种递归子集和算法会导致指针分配错误
- CSTRING分配错误
- 运行时间内存分配错误
- 以下C++代码给出了一些内存分配错误
- 尝试在c++中创建USRP对象时分配错误
- 多阵列动态内存分配错误
- C++:矢量分配错误
- 通过结构指针访问结构变量分配错误数据
- 声明向量时出现神秘的 malloc 内存分配错误