iconv的输出不正确、以及内存无法正确释放(C++)

sherwoodwang sherwoodwang 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
.源码
文件名 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)
多谢
...全文

相关推荐

评论 6
收藏 已收藏
分享
返回顶部
sherwoodwang
Linux/Unix社区 23,224 成员 74,535 内容