我正在尝试用c ++创建自定义字符串实现,我遇到了重载operator" +"的问题。我想将新字符串附加到现有字符串,当我尝试分配新的扩展字符串时,调试器分配大约12个字节,然后它应该。我无法控制分配,他只是忽略了变量" length"。这是代码:
class String
{
private:
char *ptrNiz;
public:
String(const char *niz = "")
{
ptrNiz = new char[strlen(niz)+1];
strcpy_s(ptrNiz, strlen(niz)+1, niz);
cout << "stvoren niz: " << ptrNiz << endl;
}
String(const String& refString)
{
ptrNiz = new char[strlen(refString.ptrNiz) + 1];
strcpy_s(ptrNiz, strlen(refString.ptrNiz) + 1, refString.ptrNiz);
cout << "Kopiran niz: " << ptrNiz << endl;
}
~String()
{
cout << "Unisten objekt: " << ptrNiz << endl;
delete[] ptrNiz;
}
int Length() const
{
return strlen(ptrNiz);
}
int CharAt(int i) const
{
return ptrNiz[i];
}
void Ispisi()
{
cout << ptrNiz << endl;
}
operator char*()
{
return ptrNiz;
}
String operator+=(const const String& ref)
{
const int const length = ref.Length() + this->Length() + 1;
char *temp = new char[length]; // ignores length and allocates more space
for (int i = 0; i < this->Length(); i++)
{
temp[i] = ptrNiz[i];
}
for (int j = 0; j < ref.Length(); j++)
{
temp[this->Length() + j] = ref.ptrNiz[j];
}
return String(temp);
}
};
答案 0 :(得分:2)
char *temp = new char[length]; // ignores length and allocates more space
这里要做的所有C ++实现都返回一个指向内存位置的指针,其中length
字节的空间。没有更多,没有更少。允许在内部分配更多字节,即使您的代码不能尝试访问它们(否则行为未定义)。
动态内存分配的低级细节是一个实现问题,而不是代码的关注。
对于C ++实现可能使用额外字节来调试信息的情况,调试版本是一个非常好的示例。事实上,这可能就是这里发生的事情。我想你使用的是Visual C ++。正如its documentation (CRT Debug Heap Details)所说:
当您请求内存块时,调试堆管理器会从中分配 基本堆稍大一点的内存块比请求和 返回指向该块部分的指针。
[...]
调试堆例程分配的附加内存用于 簿记信息,用于链接调试存储器块的指针 一起,以及数据两侧的小缓冲区来捕获 覆盖已分配的区域。
请注意,您的代码中存在其他严重错误。我现在决定忽略它们,只是回答了你提出的确切问题。
答案 1 :(得分:0)
您正在分配两次,一次在构造函数中,另一次在operator + =方法中。您也没有删除操作员功能中的指针,以便内存泄漏。使用智能指针或提供额外的构造函数参数,该参数指定传入指针的所有权。
答案 2 :(得分:-2)
在您的代码中,请添加以下行以使用NULL
;
String operator+=(const const String& ref)
{
// You code goes here
temp[length - 1] = '\0';
return String(temp);
}
这将按预期工作。
希望这有帮助。