浅拷贝后附加字符指针

Posted

技术标签:

【中文标题】浅拷贝后附加字符指针【英文标题】:Appending char pointer after shallow copying 【发布时间】:2016-03-04 23:58:10 【问题描述】:

我已经制作了两个字符串类对象,每个对象都有 char* 指针。通过浅拷贝,我通过浅拷贝将第一个对象复制到了第二个对象中。现在他们两个都指向同一个位置。

我要做的是将 char 指针附加到一个对象中,这样它就不会产生另一个,而是增加原始 char 指针的大小,以便第二个对象指向相同的位置。

void String::append(char c) 

    auto_ptr<StringBuffer> newdata(new StringBuffer);
    newdata.get()->reserve(this->_str->length() + 1);
    newdata.get()->smartCopy(this->_str);
    this->_str = newdata.release();
    this->_str->append(c);

 

StringBuffer的包装类

void StringBuffer::reserve(int n) 
if (_length < n) 
    int newlength = n; //max(_length*2,n);
    char* newbuf = new char[newlength];
    //copy contents of the stored string in the new buffer
    revSmartCopy(newbuf);

    //return stuff from the new buffer to the stored buffer
    delete[] this->_strbuf;
    this->_strbuf = newbuf;
    this->_length = newlength;
    newbuf = 0;



void StringBuffer::revSmartCopy(char* newString) 
int it = 0;
while (it < this->_length) 
    newString[it] = this->_strbuf[it];
    it++;



void StringBuffer::smartCopy(StringBuffer* newString) 
int shorterLength = 0;
(this->_length < newString->_length) ? shorterLength = this->_length : shorterLength = newString->_length;
int it = 0;
while (it < shorterLength) 
    *_strbuf++ = *(newString->_strbuf)++;
    it++;


这段代码正在使用我们附加的指向新副本的对象和指向前一个的旧对象进行另一次复制

【问题讨论】:

首先,这不是C。其次,auto_ptr——这已被弃用,取而代之的是std::unique_ptr。第三,所有这些代码的目的是什么? std::string 中是否缺少您认为必须自己实现的内容? 这实际上是一个实现拥有指针并对其进行字符串操作的任务。 追加一个字符不会占用您发布的所有这些内容。所需要的只是重新分配、复制、解除分配、分配。所有这些StringBuffer 的东西,我不知道它的目的是什么。另外,“我已经通过浅拷贝将第一个对象复制到第二个对象中。现在它们都指向同一个位置。”——所以如果我接受你在这里所说的,当调用析构函数时在这些对象上,您将得到一个双重删除错误,您将多次释放指针地址。 我通过引入布尔变量赋予左值对象删除权来处理这方面的问题 我已经通过引入 bool 变量来处理这方面的问题——我几乎 100% 确信这不会起作用,或者至少,像细玻璃一样脆弱,很容易破碎。一个简单的bool 变量绝不可能涵盖可以复制对象的所有方式。 【参考方案1】:

假设您将其作为练习进行,否则没有任何意义。

您不能将指针重新分配到不同的大小并使其具有相同的指针值;这可能是偶然发生的,但不可能强制执行。由于这两个对象是独立的,因此实现这项工作的唯一方法是 双重间接 - 对象中的指针指向第二个指针,即指向字符缓冲区的指针。

您还会遇到销毁问题,因为您有多个对象具有相同的指针。标准库有std::shared_ptr 来解决这个问题。如果指针在不同对象之间共享,请使用shared_ptr 来保存它。

由于只有一个指向实际字符缓冲区的指针,因此您可以使用std::unique_ptr 指向那个。您可以改用std::auto_ptr,只要您不尝试复制它就可以正常工作,但unique_ptr 是更好的选择。

【讨论】:

以上是关于浅拷贝后附加字符指针的主要内容,如果未能解决你的问题,请参考以下文章

深拷贝与浅拷贝

C++ 浅拷贝 & 深拷贝

C++类的浅拷贝深拷贝以及写时拷贝问题

C++中,啥是深拷贝?啥是浅拷贝?

引用传递与值传递______深拷贝与浅拷贝______构造函数与析构函数

iOS浅拷贝和深拷贝