gpt4 book ai didi

C++ 我的字符串类 : Pointer doesn't work

转载 作者:行者123 更新时间:2023-11-30 04:13:12 26 4
gpt4 key购买 nike

我正在用 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”时,内存地址丢失了。

感谢所有帮助,谢谢!

最佳答案

我认为您要问的是,是否有一种方法可以从您的字符串类中获取始终指向当前字符串数组的返回值。有多种方法可以做到这一点,但通常这表明设计/实现不当。

更正常的做法是告知 API 用户 c_str() 的结果会因对象的任何后续修改而失效:不要保留指针,只需再次调用 c_str()。

两个明显的选择是:a) 指向指针的指针,非常危险,因为现在你的类之外的人可以调整它,b) 提供一个包装类,它封装了一个指向指针的指针,不允许修改。

template<typename T>
struct ReadOnlyPointer {
T* m_ptr;
... operator * ...
... operator -> ...
... operator T ...
};

ReadOnlyPointer<const char*> pointer = str1.pointer();

您的“储备”功能似乎也至少存在一些问题。

  1. 即使大小可能为零,您也将 '\0' 压入 data[0]。

    我的字符串一个;a.储备(0);//碰撞?您写入了零长度数组的第一个字节。

  2. 将数据从 oldData 复制到 data 后,出于某种原因,您将“data”的值分配给“oldData”,然后再也不会使用“oldData”——这是内存泄漏。

  3. 您的 memcpy 使用“容量”而不是“大小”,因此它可能会过度复制。

改为考虑:

// ensure we have an additional 'res' bytes.
// caution: unlike stl and boost reserve, these are
// additional bytes, not total bytes.
void reserve(int res)
{
int newCapacity = NewSize(m_size + res, 0, m_capacity); //Method to find the best cap.
if(newCapacity <= m_capacity)
return;

char* newData = new char[newCapacity];
memcpy(newData, m_data, m_size);
delete[] m_data; // release the old allocation
m_data = newData;
m_capacity = newCapacity;
}

如果您没有在代码的其他地方更改大小的值,那么额外的 data[(size)] = '\0'; 可能会导致您的字符串被截断。

关于C++ 我的字符串类 : Pointer doesn't work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19485134/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com