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

标签 c++

下面的代码合法吗?

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/

相关文章:

c++ - 为什么继承会影响异常处理?

c++ - 如何在 g++ 中将 -std=c++11 定义为默认值

c++ - 我应该如何编写一个像 MPL 中那样工作的元函数?

c++ - 测试指针是否为空的最有效方法是什么?

c++ - 递归返回和基本流程

c++ - FlatBuffers 的多语言集成问题

c++ - 如何在C++中检查指针的类型

c++ - 为什么/如何编译?

c++ - 具有库和意外文件类型的Xcode链接二进制文件

C++ 转义字符和引用变量输出困惑