【发布时间】:2023-03-29 18:45:01
【问题描述】:
我们和我的朋友一起做了一个程序,其中覆盖了 new 和 new[] 运算符。 我发现当我尝试使用此代码创建字符串数组时:
string* Test1 = new string[10];
函数返回无效指针(通常它的值向前移动 8 位,我正在将程序编译到 x64 平台)。 我们的 new[] 函数如下所示:
void* operator new[] (size_t e)
{
void* Test2 = operator new(e);
return Test2;
}
在返回前使用调试器运行程序时,指针Test2 的值为0x0000000009dfaa90,但Test1 的值变为0x0000000009dfaa98。
这种情况只发生在字符串类型上。我试过对“int[10]”、“string* [10]”和我的一个类的对象做同样的事情,但问题只有在处理字符串时才会出现,还有代码:
string* Test1 = new string;
工作得很好。
有人可以解释一下为什么会发生这种情况以及如何使其正常工作吗?
PS:我们使用的是 Visual Studio 2012 Proffesional
编辑:我刚刚测试了它未覆盖new[],它在创建字符串表时以同样的方式工作(返回的指针不是函数尝试return的指针),所以它似乎不是问题.有人能解释一下为什么指针的值只对字符串数组发生变化,以及如果似乎没有任何其他指令可以改变它,它是如何变化的?
【问题讨论】:
-
你真的要分配一个由 10 个字符串组成的数组吗?
-
是的,我就是这么做的
-
当您尝试分配
new string[10]时,e在重载的new[]中有什么值? -
在
new[]中是 328,在非覆盖new[]中是 408
标签: c++ string overriding new-operator