我已经创建了两个字符串类对象,每个对象都有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++;
}
}
此代码正在使用我们附加的对象进行另一次复制,指向新副本,而旧版本指向前一个
答案 0 :(得分:0)
让我们假设你做这个练习,因为没有其他意义。
您无法重新分配指向不同大小的指针,并将其指向相同的指针值;这可能是偶然发生的,但是不可能强制执行。由于这两个对象是独立的,唯一的方法是双间接 - 对象中的指针指向第二个指针,它是指向字符缓冲区的指针。
你也会遇到破坏问题,因为你有多个具有相同指针的对象。标准库有std::shared_ptr
来解决这个问题。如果指针在不同对象之间共享,请使用shared_ptr
来保留它。
由于只有一个指向实际字符缓冲区的指针,因此可以使用std::unique_ptr
作为该指针。您可以使用std::auto_ptr
,只要您不尝试复制它就会正常工作,但unique_ptr
是更好的选择。