C++ 使用“new”创建字符数组会生成比我指定的更多的字符。C++;

C++ 使用“new”创建字符数组会生成比我指定的更多的字符。C++;,c++,arrays,pointers,dynamic-memory-allocation,C++,Arrays,Pointers,Dynamic Memory Allocation,所以我有一个CS班的作业,这给我带来了一些麻烦。目标是创建我自己的非空终止字符串类,而不使用任何cstring函数。类中的数据必须包含字符串的长度、一个名为“data”的char*,以及一些与我的问题无关的内容 因此,当我为字符串分配内存时,我调用MyStrCopy(MyString*tar,const char*str)函数,该函数使用tar->data=new char[length]来分配内存,“length”是作为str传入的cstring的长度,它按预期工作。但是,当以这种方式分配内存

所以我有一个CS班的作业,这给我带来了一些麻烦。目标是创建我自己的非空终止字符串类,而不使用任何
cstring
函数。类中的数据必须包含字符串的长度、一个名为“data”的
char*
,以及一些与我的问题无关的内容

因此,当我为字符串分配内存时,我调用
MyStrCopy(MyString*tar,const char*str)
函数,该函数使用
tar->data=new char[length]
来分配内存,“length”是作为
str
传入的cstring的长度,它按预期工作。但是,当以这种方式分配内存时,数组总是比我指定的要大得多(例如,我请求6个字节,我得到的字节数超过11个),而且我得到的字节数似乎是随机的,每次运行都不同。我试着编写一个函数来剔除不需要的字符,但我认为我只是缺乏如何实现这一点的技能/知识

这些额外的数据使我的一些函数变得不正常,我一直在思考如何修复它。有什么想法吗

我在下面定义了我的类

#包括
#布拉格语一次
类MyString{
私人:
字符*数据;
整数长度;
静态布尔打印外壳;
int getlength(常量字符*str);
无效MyStrCopy(MyString*tar,const char*str);
公众:
//建设者
MyString();
MyString(常量字符*数据);
MyString(MyString和data2Copy);
~MyString();
//运算符重载
//赋值运算符
MyString运算符=(const MyString&data);
MyString运算符=(常量字符*数据);
//算术运算符
MyString操作符+(const MyString和rightStr);
//减量前/减量后
MyString运算符--();
MyString运算符--(int);
//布尔运算符
friend bool运算符==(const MyString和leftStr,const MyString和rightStr);
friend bool操作符>(const MyString和leftStr,const MyString和rightStr);
friend bool运算符长度=GetLength(str);
如果(数据!=NULL)
删除数据;
tar->data=新字符[长度];
对于(int i=0;ilength;i++)
tar->data[i]=str[i];
tar->cull();
}
void MyString::cull(){
//WIP目前实际上什么都不做
int currLen=getlennth(数据);
while(currLen>长度)
数据[curren--];
}
int MyString::getLength(){
返回长度;
}
int MyString::getLength(const char*str){
int len=0;
while(str[len]!=NULL)
len++;
回程透镜;
}
提前谢谢

你的意思是:

new char[tar->length];
length
属性未初始化,因此您会得到未定义的行为,尽管我会在调试器中逐步执行以确保。这是一些令人困惑的代码,因为
MyStrCopy
是一个非
静态的
函数,您不应该使用显式的
tar
参数调用它,这暗示为
This

调用此函数
copy(const char*data)
比使用误导性的类名样式
MyStrCopy
更有意义。只传递您需要的内容,如
数据
,并直接使用属性,而不是通过参数间接使用属性

请记住,您可以根据另一个构造函数定义一个构造函数:

MyString(const char* data);
MyString(const MyString& src) : MyString(src.data) { };
其中,
copy
函数完全消失,因为它只是第一个构造函数的一部分

这里也有一些打字错误,比如
getlength
,所以一定要仔细检查所有内容

MyString::MyString(MyString& data2Copy) {
  MyStrCopy(this, data2Copy.data);
}
基本上,默认值构造了一个新的
MyString
实例,在调用
MyStrCopy()
之前不初始化其任何成员。在
MyStrCopy
中:

if (data != NULL)
    delete data;

由于
数据
,或者新类的任何其他成员都没有被初始化——出于上述原因,
数据
这里将是随机垃圾,从这一点上说,它是所有未定义的行为。

因此,我在调试器中得到的额外字符是调试器试图通过继续打印字符来提供帮助,直到它找到一个NULL,这可能是因为我不允许NULL终止。我以为我的电脑确实出了问题,但不是,只是调试器的问题。感谢所有关于这方面的额外投入;它真的帮我弄明白了一些事情