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
),所以似乎不是问题。有人能解释一下为什么指针的值只对字符串数组改变,如果没有其他指令可以改变它,它是如何改变的吗?
答案是new/delete
和new[]/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 语言最