通过引用传递的C ++方法参数 - 内存问题

时间:2010-03-25 21:00:39

标签: c++ memory pass-by-reference

假设,

void proc(CString& str)
{
  str = "123";
}

void runningMethod()
{
  CString str="ABC";
  proc(str);
}

据我所知,在runningMethod str的出口会自动解除分配;在这种情况下,C ++如何删除旧数据(“ABC”)?

谢谢,

吉尔。

5 个答案:

答案 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'; }