iconv的输出不正确、以及内存无法正确释放(C++)
.源码
文件名 file.cc
.环境
Fedora9
GCC4.3.0/4.3.1
glibc内置的iconv/单独安装的libiconv
上述环境一一配对试过,并保证安装正确,且支持UCS-4、UTF-8,均不能如预期执行
.故障
首先,非预期输出,且每次输出不同
此外,内存无法正确释放
.预期输出
5
0 0 0 103 0 0 0 111 0 0 0 111 0 0 0 100 0 0 0 0
.调试
[i]当前环境 Fedora9 GCC4.3.0 glibc内置的iconv
$ g++ file.cc -g
$ gdb a.out
GNU gdb Fedora (6.8-1.fc9)
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...
(gdb) start
Breakpoint 1 at 0x8048781: file file.cc, line 6.
Starting program: /home/<user>/a.out
main () at file.cc:6
6 char *x=new char [5],*y=new char [20];
Missing separate debuginfos, use: debuginfo-install gcc.i386 glibc.i686
(gdb) next
7 for(int i=0;i!=5;++i)
(gdb)
8 x[i]=("good")[i];
(gdb)
7 for(int i=0;i!=5;++i)
(gdb)
8 x[i]=("good")[i];
(gdb)
7 for(int i=0;i!=5;++i)
(gdb)
8 x[i]=("good")[i];
(gdb)
7 for(int i=0;i!=5;++i)
(gdb)
8 x[i]=("good")[i];
(gdb)
7 for(int i=0;i!=5;++i)
(gdb)
8 x[i]=("good")[i];
(gdb)
7 for(int i=0;i!=5;++i)
(gdb)
9 iconv_t cd =iconv_open("UCS-4","UTF-8");
(gdb) print cd==-1
$1 = false
(gdb)
10 size_t xx=5,yy=20;
(gdb)
11 cout<<iconv(cd,&x,&xx,&y,&yy)<<'\n';
(gdb)
0
12 iconv_close(cd);
(gdb)
13 if(xx!=0)return 0;
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
16 cout<<'\n';
(gdb)
4294967257 15 2 0 0 0 0 0 0 0 0 0 1 0 0 0 61 45 4294967283 4294967223
17 delete [] x;
(gdb)
*** glibc detected *** /home/<user>/a.out: munmap_chunk(): invalid pointer: 0x083fa00d ***
======= Backtrace: =========
/lib/libc.so.6[0x2c37e4]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0x1e5e41]
/usr/lib/libstdc++.so.6(_ZdaPv+0x1d)[0x1e5e9d]
/home/<user>/a.out(__gxx_personality_v0+0x277)[0x80488c3]
/lib/libc.so.6(__libc_start_main+0xe6)[0x26c5d6]
/home/<user>/a.out(__gxx_personality_v0+0x35)[0x8048681]
======= Memory map: ========
00110000-0012c000 r-xp 00000000 fd:00 311394 /lib/ld-2.8.so
0012c000-0012d000 r--p 0001c000 fd:00 311394 /lib/ld-2.8.so
0012d000-0012e000 rw-p 0001d000 fd:00 311394 /lib/ld-2.8.so
0012e000-0012f000 r-xp 0012e000 00:00 0 [vdso]
0012f000-00214000 r-xp 00000000 fd:00 1417928 /usr/lib/libstdc++.so.6.0.10
00214000-00218000 r--p 000e4000 fd:00 1417928 /usr/lib/libstdc++.so.6.0.10
00218000-00219000 rw-p 000e8000 fd:00 1417928 /usr/lib/libstdc++.so.6.0.10
00219000-0021f000 rw-p 00219000 00:00 0
0021f000-00246000 r-xp 00000000 fd:00 311409 /lib/libm-2.8.so
00246000-00247000 r--p 00026000 fd:00 311409 /lib/libm-2.8.so
00247000-00248000 rw-p 00027000 fd:00 311409 /lib/libm-2.8.so
00248000-00255000 r-xp 00000000 fd:00 311380 /lib/libgcc_s-4.3.0-20080428.so.1
00255000-00256000 rw-p 0000c000 fd:00 311380 /lib/libgcc_s-4.3.0-20080428.so.1
00256000-003b9000 r-xp 00000000 fd:00 311401 /lib/libc-2.8.so
003b9000-003bb000 r--p 00163000 fd:00 311401 /lib/libc-2.8.so
003bb000-003bc000 rw-p 00165000 fd:00 311401 /lib/libc-2.8.so
003bc000-003bf000 rw-p 003bc000 00:00 0
08048000-08049000 r-xp 00000000 fd:00 704701 /home/<user>/a.out
08049000-0804a000 rw-p 00000000 fd:00 704701 /home/<user>/a.out
083fa000-0841b000 rw-p 083fa000 00:00 0 [heap]
b7f24000-b7f27000 rw-p b7f24000 00:00 0
b7f2f000-b7f30000 rw-p b7f2f000 00:00 0
b7f30000-b7f37000 r--s 00000000 fd:00 1443159 /usr/lib/gconv/gconv-modules.cache
bfe21000-bfe36000 rw-p bffeb000 00:00 0 [stack]
Program received signal SIGABRT, Aborted.
0x0012e416 in __kernel_vsyscall ()
(gdb)
Single stepping until exit from function __kernel_vsyscall,
which has no line number information.
Program terminated with signal SIGABRT, Aborted.
The program no longer exists.
(gdb)
多谢
文件名 file.cc
#include <iconv.h>
#include <iostream>
using namespace std;
int main()
{
char *x=new char [5],*y=new char [20];
for(int i=0;i!=5;++i)
x=("good")[i];
iconv_t cd =iconv_open("UCS-4","UTF-8");
size_t xx=5,yy=20;
cout<<iconv(cd,&x,&xx,&y,&yy)<<'\n';
iconv_close(cd);
if(xx!=0)return 0;
for(int i=0;i!=20-yy;++i)
cout<<(unsigned int)y[i]<<' ';
cout<<'\n';
delete [] x;
delete [] y;
return 0;
}.环境
Fedora9
GCC4.3.0/4.3.1
glibc内置的iconv/单独安装的libiconv
上述环境一一配对试过,并保证安装正确,且支持UCS-4、UTF-8,均不能如预期执行
.故障
首先,非预期输出,且每次输出不同
此外,内存无法正确释放
.预期输出
5
0 0 0 103 0 0 0 111 0 0 0 111 0 0 0 100 0 0 0 0
.调试
[i]当前环境 Fedora9 GCC4.3.0 glibc内置的iconv
$ g++ file.cc -g
$ gdb a.out
GNU gdb Fedora (6.8-1.fc9)
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...
(gdb) start
Breakpoint 1 at 0x8048781: file file.cc, line 6.
Starting program: /home/<user>/a.out
main () at file.cc:6
6 char *x=new char [5],*y=new char [20];
Missing separate debuginfos, use: debuginfo-install gcc.i386 glibc.i686
(gdb) next
7 for(int i=0;i!=5;++i)
(gdb)
8 x[i]=("good")[i];
(gdb)
7 for(int i=0;i!=5;++i)
(gdb)
8 x[i]=("good")[i];
(gdb)
7 for(int i=0;i!=5;++i)
(gdb)
8 x[i]=("good")[i];
(gdb)
7 for(int i=0;i!=5;++i)
(gdb)
8 x[i]=("good")[i];
(gdb)
7 for(int i=0;i!=5;++i)
(gdb)
8 x[i]=("good")[i];
(gdb)
7 for(int i=0;i!=5;++i)
(gdb)
9 iconv_t cd =iconv_open("UCS-4","UTF-8");
(gdb) print cd==-1
$1 = false
(gdb)
10 size_t xx=5,yy=20;
(gdb)
11 cout<<iconv(cd,&x,&xx,&y,&yy)<<'\n';
(gdb)
0
12 iconv_close(cd);
(gdb)
13 if(xx!=0)return 0;
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
15 cout<<(unsigned int)y[i]<<' ';
(gdb)
14 for(int i=0;i!=20-yy;++i)
(gdb)
16 cout<<'\n';
(gdb)
4294967257 15 2 0 0 0 0 0 0 0 0 0 1 0 0 0 61 45 4294967283 4294967223
17 delete [] x;
(gdb)
*** glibc detected *** /home/<user>/a.out: munmap_chunk(): invalid pointer: 0x083fa00d ***
======= Backtrace: =========
/lib/libc.so.6[0x2c37e4]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0x1e5e41]
/usr/lib/libstdc++.so.6(_ZdaPv+0x1d)[0x1e5e9d]
/home/<user>/a.out(__gxx_personality_v0+0x277)[0x80488c3]
/lib/libc.so.6(__libc_start_main+0xe6)[0x26c5d6]
/home/<user>/a.out(__gxx_personality_v0+0x35)[0x8048681]
======= Memory map: ========
00110000-0012c000 r-xp 00000000 fd:00 311394 /lib/ld-2.8.so
0012c000-0012d000 r--p 0001c000 fd:00 311394 /lib/ld-2.8.so
0012d000-0012e000 rw-p 0001d000 fd:00 311394 /lib/ld-2.8.so
0012e000-0012f000 r-xp 0012e000 00:00 0 [vdso]
0012f000-00214000 r-xp 00000000 fd:00 1417928 /usr/lib/libstdc++.so.6.0.10
00214000-00218000 r--p 000e4000 fd:00 1417928 /usr/lib/libstdc++.so.6.0.10
00218000-00219000 rw-p 000e8000 fd:00 1417928 /usr/lib/libstdc++.so.6.0.10
00219000-0021f000 rw-p 00219000 00:00 0
0021f000-00246000 r-xp 00000000 fd:00 311409 /lib/libm-2.8.so
00246000-00247000 r--p 00026000 fd:00 311409 /lib/libm-2.8.so
00247000-00248000 rw-p 00027000 fd:00 311409 /lib/libm-2.8.so
00248000-00255000 r-xp 00000000 fd:00 311380 /lib/libgcc_s-4.3.0-20080428.so.1
00255000-00256000 rw-p 0000c000 fd:00 311380 /lib/libgcc_s-4.3.0-20080428.so.1
00256000-003b9000 r-xp 00000000 fd:00 311401 /lib/libc-2.8.so
003b9000-003bb000 r--p 00163000 fd:00 311401 /lib/libc-2.8.so
003bb000-003bc000 rw-p 00165000 fd:00 311401 /lib/libc-2.8.so
003bc000-003bf000 rw-p 003bc000 00:00 0
08048000-08049000 r-xp 00000000 fd:00 704701 /home/<user>/a.out
08049000-0804a000 rw-p 00000000 fd:00 704701 /home/<user>/a.out
083fa000-0841b000 rw-p 083fa000 00:00 0 [heap]
b7f24000-b7f27000 rw-p b7f24000 00:00 0
b7f2f000-b7f30000 rw-p b7f2f000 00:00 0
b7f30000-b7f37000 r--s 00000000 fd:00 1443159 /usr/lib/gconv/gconv-modules.cache
bfe21000-bfe36000 rw-p bffeb000 00:00 0 [stack]
Program received signal SIGABRT, Aborted.
0x0012e416 in __kernel_vsyscall ()
(gdb)
Single stepping until exit from function __kernel_vsyscall,
which has no line number information.
Program terminated with signal SIGABRT, Aborted.
The program no longer exists.
(gdb)
多谢
...全文
相关推荐
iconv()函数的用法
- `outbuf`: 输出缓冲区。 - `outbytesleft`: 记录输出缓冲区的剩余空间。- **iconv_close()**: 关闭转换句柄并释放资源。
深入解析ICONV字符编码转换库的使用与原理
ICONVICONV库是一个用于字符编码转换的开源库,广泛应用于各种操作系统中,如GNU/Linux、FreeBSD等。它提供了一个灵活、高效的方式来转换文本数据的编码格式,确保信息在不同系统和应用间正确地交换和显示。ICONV库的主要作用是减少因编码格式不兼容导致的数据损坏问题,增强了软件的国际兼容性。UTF-8是一种针对Unicode的可变长度字符编码,也是互联网上使用最广的字符编码。
iconv.h iconv.lib charset.lib
如果不做转换,不同编码的文本在相互交互时可能会出现乱码问题。`iconv`库提供了一个标准化的方法来解决这个问题,使得开发者可以方便地在各种编码之间进行转换,确保数据的正确性和兼容性。
iconv测试,c语言
- `<sys/mman.h>`:内存映射文件定义。2. **宏定义**: - `DEBUG`:如果定义了该宏,则启用调试输出。 - `TRACE`:条件调试输出函数。
iconv.rar - 编码转换工具
这个工具能够帮助用户解决由于字符编码不一致导致的问题,确保文本在不同平台之间的正确传输和显示。


