c++ - 为什么当大小只有 4 时,持有 IP 的字符串需要 15 字节?

标签 c++ string memory-management

据我了解,C++ 中的 char 需要 1 个字节。因此,包含 IP 地址的字符串的大小应为 15 个字节。考虑这段代码:

char *temp = new char[15];
ifstream iss("file.txt"); //contains an ip address
iss >> temp;

cout << "temp : "<< temp << " ";
cout << sizeof (temp) << endl;

它显示大小为 4。有人可以解释为什么吗?
然后我尝试了同样的方法,只是这次我只为 temp 分配了 4 个字节:

    char *temp = new char[4];

这次结果是之前的结果附加了:

*** glibc detected *** /home/HelloWorld: double free or corruption (out): 0x08557030 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x75ee2)[0xb758bee2]
/lib/i386-linux-gnu/libc.so.6(fclose+0x154)[0xb757b424]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZNSt12__basic_fileIcE5closeEv+0x47)[0xb7746b87]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZNSt13basic_filebufIcSt11char_traitsIcEE5closeEv+0x98)[0xb7784328]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZNSt14basic_ifstreamIcSt11char_traitsIcEED1Ev+0x3f)[0xb77846af]
/home/HelloWorld[0x8048e2d]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb752f4d3]
/home/HelloWorld[0x8048ab1]
======= Memory map: ========
08048000-0804a000 r-xp 00000000 08:01 536973     /home/HelloWorld
0804a000-0804b000 r--p 00001000 08:01 536973     /home/HelloWorld
0804b000-0804c000 rw-p 00002000 08:01 536973     /home/HelloWorld
08557000-08578000 rw-p 00000000 00:00 0          [heap]
b74e8000-b74ea000 rw-p 00000000 00:00 0 
b74ea000-b7514000 r-xp 00000000 08:01 655846     /lib/i386-linux-gnu/libm-2.15.so
b7514000-b7515000 r--p 00029000 08:01 655846     /lib/i386-linux-gnu/libm-2.15.so
b7515000-b7516000 rw-p 0002a000 08:01 655846     /lib/i386-linux-gnu/libm-2.15.so
b7516000-b76ba000 r-xp 00000000 08:01 655851     /lib/i386-linux-gnu/libc-2.15.so
b76ba000-b76bc000 r--p 001a4000 08:01 655851     /lib/i386-linux-gnu/libc-2.15.so
b76bc000-b76bd000 rw-p 001a6000 08:01 655851     /lib/i386-linux-gnu/libc-2.15.so
b76bd000-b76c1000 rw-p 00000000 00:00 0 
b76c1000-b76dc000 r-xp 00000000 08:01 655821     /lib/i386-linux-gnu/libgcc_s.so.1
b76dc000-b76dd000 r--p 0001a000 08:01 655821     /lib/i386-linux-gnu/libgcc_s.so.1
b76dd000-b76de000 rw-p 0001b000 08:01 655821     /lib/i386-linux-gnu/libgcc_s.so.1
b76de000-b77bb000 r-xp 00000000 08:01 792998     /usr/lib/i386-linux-gnu/libstdc++.so.6.0.18
b77bb000-b77bf000 r--p 000dc000 08:01 792998     /usr/lib/i386-linux-gnu/libstdc++.so.6.0.18
b77bf000-b77c0000 rw-p 000e0000 08:01 792998     /usr/lib/i386-linux-gnu/libstdc++.so.6.0.18
b77c0000-b77c7000 rw-p 00000000 00:00 0 
b77d5000-b77d9000 rw-p 00000000 00:00 0 
b77d9000-b77da000 r-xp 00000000 00:00 0          [vdso]
b77da000-b77fa000 r-xp 00000000 08:01 655841     /lib/i386-linux-gnu/ld-2.15.so
b77fa000-b77fb000 r--p 0001f000 08:01 655841     /lib/i386-linux-gnu/ld-2.15.so
b77fb000-b77fc000 rw-p 00020000 08:01 655841     /lib/i386-linux-gnu/ld-2.15.so
bff69000-bff8a000 rw-p 00000000 00:00 0          [stack]

我猜这是因为内存分配不足。有人可以解释一下这里是如何管理内存的吗?

最佳答案

temp类型为 char * , 所以 sizeof (temp)获取指针的大小,通常与您机器的字长相同,即 32 位机器为 4 个字节,64 位机器为 8 个字节。

要获取 C 风格字符串的长度,请使用 std::strlen(temp)来自 <cstring>

关于c++ - 为什么当大小只有 4 时,持有 IP 的字符串需要 15 字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19628927/

相关文章:

memory-management - 图像基地址、虚拟地址和相对虚拟地址有什么区别?

c++ - 鸽子洞/多个数字

C++ 模板这可能吗?

c++ - 仅当我的程序访问内存时,visual studio 中的数据断点才会中断

python - 如何将任意选项字符串解析为 python 字典

c - realloc:下一个大小无效错误,任何人都可以指出我在内存分配中犯的错误

python - 字符串到列表的Python转换

c++ - Regex/grep/findstr 用于定位内存分配 C++

c++ - STL 容器的元素生命周期

c++ - 为什么调试器只显示我的数组指针中的一个元素?