假设,
void proc(CString& str)
{
str = "123";
}
void runningMethod()
{
CString str="ABC";
proc(str);
}
据我所知,在runningMethod str的出口会自动解除分配;在这种情况下,C ++如何删除旧数据(“ABC”)?
谢谢,
吉尔。
答案 0 :(得分:5)
"ABC"
时, = "123"
被覆盖了。
在内部,字符串是一个字符数组。一开始,它创建了一个包含{'A', 'B', 'C', '\0'}
的新缓冲区。分配后,它只是在'1'
上写了'A'
,依此类推。
当它被破坏时,它删除了缓冲区。
答案 1 :(得分:1)
就像你写的一样:
CString foo = "ABC";
foo = "123";
答案 2 :(得分:0)
确切的细节取决于CString
的实现,但重要的是你不必担心分配和释放,因为班级会为你处理它。
答案 3 :(得分:0)
在大多数情况下,当您在proc()
中执行作业时,“ABC”将被释放。这通常在重载的运算符方法中完成。例如here
你有一个例子,看看这样的重载是什么样的。
String& String::operator= (const String& other)
{
char* otherdata = other.data;
char* olddata = data;
if (otherdata != 0)
{
data = new char[other.length+1];
length = other.length;
memcpy(data,otherdata,other.length+1);
}
else
{
data = 0;
length = 0;
}
if (olddata != 0)
{
delete[] olddata;
}
return *this;
}
答案 4 :(得分:0)
这里要记住几件事。首先,类的operator =通常会在分配新数据之前删除它用来引用的任何内容。嗯,这并不完全正确,通常智能开发人员将实现operator =首先创建传入类的副本,然后使用新临时交换当前数据,现在拥有所有权并删除它。但要记住的重要部分是,在operator = function存在之前,旧数据通常会被丢弃。
要记住的另一件事是“ABC”是一个字符串文字。该标准并没有真正定义它们必须如何存储,它只是说明了允许某些常规实现的限制。通常,字符串文字将在程序数据中显示为只读元素。在这种情况下,只要程序的图像被加载到内存中(当它基本上运行时)它就永远不会被删除。这就是为什么这样的代码是UB的全部原因:
void f()
{
char * x = "hello"; // points to a string literal.
x[0] = 'H';
}
// correct implementation is:
void f()
{
char x[] = "hello"; // reserved an array of 6 characters and copies string literal content.
x[0] = 'H';
}