当前位置: 首页 > 知识库问答 >
问题:

使用重写New[]运算符创建字符串数组

养鸿运
2023-03-14
string* Test1 = new string[10];
void* operator new[] (size_t e)
{
    void* Test2 = operator new(e); 
    return Test2;
}

返回前用调试器运行程序时,指针test2的值为0x0000000009DFAA90,但test1的值变为0x0000000009DFAA98。
这种情况只发生在字符串类型中。我试着对我的一个类的“int[10]”、“string*[10]”和对象做同样的操作,但问题只发生在处理string和代码时:

string* Test1 = new string;

工作非常好。

有没有人能解释一下为什么会发生这种情况,以及如何使它正常工作?

PS:我们正在使用Visual Studio2012课程

编辑:我刚刚测试了它,它不重写new[],它在创建字符串表时也是这样工作的(返回的指针不是函数try要return),所以似乎不是问题。有人能解释一下为什么指针的值只对字符串数组改变,如果没有其他指令可以改变它,它是如何改变的吗?

共有1个答案

咸皓
2023-03-14

答案是new/deletenew[]/delete[]是不同的。这可能不会让您感到惊讶,但另一个令人惊讶的消息(不是有意的双关语)是new运算符和运算符new是不同的。

下面是测试该问题的示例代码(您可以将tested_type的typedef更改为):

#include <iostream>
#include <vector>
#include <string>

typedef std::string tested_type;
void* Test2;
size_t allocated_mem_size;

void* operator new[] (size_t e)
{
    void* retaddr = operator new(e);
    Test2 = retaddr;
    allocated_mem_size = e;
    return retaddr;
}

int _tmain(int argc, _TCHAR* argv[])
{
    void* Test1 = new tested_type[10];
    std::cout << "sizeof(tested_type)*10 is " << sizeof(tested_type)*10 << "\n"
              << "Test1 is " << Test1 << "\n"
              << "Test2 is " << Test2 << "\n"
              << "operator new[] was called with e == " << allocated_mem_size << "\n"
              << "What's in the missing bytes? " << *(size_t*)Test2 << "\n";
}

我的计算机上的输出是:

sizeof(tested_type)*10 is 280
Test1 is 0085D64C
Test2 is 0085D648
operator new[] was called with e == 284
What's in the missing bytes? 10
sizeof(tested_type)*10 is 40
Test1 is 0070D648
Test2 is 0070D648
operator new[] was called with e == 40
What's in the missing bytes? 3452816845

现在,如果我们将tested_type更改为std::vector ,我们有

sizeof(tested_type)*10 is 160
Test1 is 004AD64C
Test2 is 004AD648
operator new[] was called with e == 164
What's in the missing bytes? 10

现在我们在这里看到一个模式:添加的额外字节数等于分配的元素数。此外,添加字节的唯一时间是当类型是非平凡的...

就是这样!

 类似资料:
  • 有可能使用@Configurable类那 我知道用@Autowired和@Resource等是可能的...还有其他的吗? 如。 然后像这样 除了能够使用<code>new</code>操作符创建<code>MyObj</code>并仍然让spring处理注释之外,还有其他选择吗? ——编辑: 在使用@Autowired时,可以使用来做到这一点,看看一些带有Spring和AOP的Hibernate和

  • 我知道字符串文字和新字符串对象之间的区别,也知道它在内部是如何工作的。但我的问题是,这有点超前。当我们使用new关键字as创建字符串对象时 在本例中,我们传递的是字符串类型的参数。我的问题是这个字符串是在哪里生成的-堆还是字符串常量池还是其他地方? 据我所知,这个参数是一个字符串文字,所以它应该在字符串常量池中。如果是这样的话,那么intern方法的用途是什么?只需将变量str链接到常量池?因为“

  • 问题内容: 想知道有没有比如下计算给定字符串的字符数更简单的方法? 问题答案: 具有完全的Unicode支持(Java 11+)1的最简单的方法来计算字符串中每个字符的出现次数: 1)答案的结尾是具有完整Unicode支持的Java 8版本。 输出量 更新: 对于Java 8+(不支持补充平面中的字符,例如emoji): 更新2: 同样适用于Java 8+。 我误会了,以为它是在Java 9之前才

  • 我试图连接两个字符串,一个字符串有一些值,另一个字符串有空。 示例: 并用concat函数和运算符连接这两个字符串 示例: 根据我的理解,当在concat函数中使用空字符串时,因为string2是空的,所以不会创建新的引用。但在使用运算符时,将在字符串池常量中创建一个新引用。但在下面的代码中,当使用运算符时,不会创建新的引用。 输出: 字符串1:69066349 类别:69066349 相同的 第

  • 在这个问题之前,我先要说明一个事实,那就是我学习编程才一个月,而这个学校的作业却把我难住了。具体地说,它是摩尔斯电码到英语翻译器(反之亦然)...这是我被困住的部分:

  • 目标 了解实例化 String 对象和设置其值的多种方法 了解字符串串联和方法链 熟悉 Java 语言的算术运算符 字符串 目前为止,您已经遇到过多种类型的 String。在 Java 语言中,字符串是 String 类型的一级对象,包含可帮助您处理它们的方法。 在 C 语言中,处理字符串需要大量精力,因为它们是您必须操作的 8 位字符组成的以 null 结尾的数组。(在字符串方面,与 C 语言最