【发布时间】:2013-10-21 01:58:02
【问题描述】:
我正在用 c++ 11 构建自己的字符串类,但我遇到了内存问题。
主要:
MyString str1; //Works ok, constructor creates empty char array.
const char* pointer1 = str1.c_str(); //Return the pointer to the array.
str1.Reserve(5);
// Now, when I use the Reverse method in string1, Pointer1 is
// pointing to the old memory address.
如何将str1中的数组数据改为内存地址?
换句话说,我该如何解决这个问题:
pointer1 == str1.c_str();
预留方式:
void reserve(int res)
{
capacity = NewSize(size + res,0 , capacity); //Method to find the best cap.
char* oldData = data;
data = new char[capacity];
memcpy(data, oldData, capacity);
oldData = data;
//delete[] data;
data[(size)] = '\0';
}
这会返回所有正确的数据,但是当我执行“oldData = data”时,内存地址会丢失。
感谢所有帮助,谢谢!
【问题讨论】:
-
既然
oldData应该指向之前的位置,为什么要重新分配data的值而不是delete[] oldData? -
你为什么要这样做:
const char* pointer1 = str1.c_str();str1.Reserve(5);?除非您打算承诺 str1.c_str() 永远不会改变,否则这是行不通的。您的用户必须注意,对字符串的更改可能会导致对指针的更改,并且只能在保证字符串对象不会更改的范围内使用 c_str() 的返回值。 -
c_str() documentation 清楚地表明这是未定义的行为。
-
在 Reserve 方法中,data 是 char*。我要做的是: 1. 将旧数据保存在 OldData 2. 在 Data 上使用 new 创建一个新数组。 (这是地址丢失的地方) 3. 将旧数据复制到新数据中。
-
Egads,一句话,你不能。
标签: c++ pointers memory-management c++11 operator-overloading