gpt4 book ai didi

c++ - 在函数中返回指针

转载 作者:太空狗 更新时间:2023-10-29 23:21:20 25 4
gpt4 key购买 nike

下面的代码合法吗?

char* randomMethod1() {
char* ret = "hello";
return ret;
}

还有这个?

char* randomMethod2() {
char* ret = new char[10];

for (int i = 0; i < 9; ++i) {
ret[i] = (char)(65 + i);
}

ret[9] = '\0';

return ret;
}

我会说第一个是合法的,因为你实际上返回了一个指向字符串文字的指针,我认为它是从程序的字符串表中加载的。但是,我会说第二个不是。我会说在第二种方法中你在堆栈上分配内存,一旦你离开函数,它可能会被另一种方法使用,变成垃圾你正在返回的指针。真的是这样吗?

这是反汇编代码。我如何才能看到它正在堆上分配?

char* randomMethod2() {
000536E0 push ebp
000536E1 mov ebp,esp
000536E3 sub esp,0E4h
000536E9 push ebx
000536EA push esi
000536EB push edi
000536EC lea edi,[ebp-0E4h]
000536F2 mov ecx,39h
000536F7 mov eax,0CCCCCCCCh
000536FC rep stos dword ptr es:[edi]
char* ret = new char[10];
000536FE push 0Ah
00053700 call operator new (511E0h)
00053705 add esp,4
00053708 mov dword ptr [ebp-0E0h],eax
0005370E mov eax,dword ptr [ebp-0E0h]
00053714 mov dword ptr [ret],eax

for (int i = 0; i < 9; ++i) {
00053717 mov dword ptr [i],0
0005371E jmp randomMethod2+49h (53729h)
00053720 mov eax,dword ptr [i]
00053723 add eax,1
00053726 mov dword ptr [i],eax
00053729 cmp dword ptr [i],9
0005372D jge randomMethod2+5Fh (5373Fh)
ret[i] = (char)(65 + i);
0005372F mov eax,dword ptr [i]
00053732 add eax,41h
00053735 mov ecx,dword ptr [ret]
00053738 add ecx,dword ptr [i]
0005373B mov byte ptr [ecx],al
}
0005373D jmp randomMethod2+40h (53720h)

ret[9] = '\0';
0005373F mov eax,dword ptr [ret]
00053742 mov byte ptr [eax+9],0

return ret;
00053746 mov eax,dword ptr [ret]
}
00053749 pop edi
0005374A pop esi
0005374B pop ebx
0005374C add esp,0E4h
00053752 cmp ebp,esp
00053754 call @ILT+320(__RTC_CheckEsp) (51145h)
00053759 mov esp,ebp
0005375B pop ebp
0005375C ret

最佳答案

两者都是合法的。在第二个中,您从堆栈分配内存。您正在使用 new,它从堆中分配内存。如果您不使用 delete 释放从第二种方法返回的指针,就会发生内存泄漏

顺便说一下,堆栈分配的数组是这样声明的:

char x[10]; // Note that there isn't any `new`.

此行调用 operator new 从堆中分配内存并初始化对象。

00053700  call        operator new (511E0h)

关于c++ - 在函数中返回指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1420280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com