【问题标题】:What if the function would return a pointer to a char array and I would not use it如果函数会返回一个指向 char 数组的指针而我不会使用它怎么办?
【发布时间】:2021-10-28 18:02:09
【问题描述】:

所以,例如我有这个功能:

char* retCharPtr(void) {
    char data[15] {"Data is here"};
    return data; }

char* retCharPtr1(void) {
    char *data = new char[15];
    strcat(data, "Data is here");
    return data; }

如果std::cout << retCharPtr1();,请说明数据数组将放置在哪里, 如果std::cout << retCharPtr();怎么办?

一般来说,当函数返回它们的状态(int)时,变量的值到哪里去了,它没有存储在任何地方。这 4 个字节在程序的完整执行过程中是否被占用?

我需要该函数为cout 返回一个数组,而无需下一次调用delete,并在内存中泄漏。

【问题讨论】:

  • @RemyLebeau retCharPtr() 表现出未定义的行为。 |是不是因为函数完成后会删除数据数组,返回的地址指向清空的内存?
  • 这是一个非常危险的未定义行为,因为编译器为retCharPtr 选择的可能行为看起来在很多时候都有效。一个好的编译器会警告你不要这样做,因为它明显不起作用的时候可能是你真正需要它工作的时候。
  • 我不认为这是一个 C++ 问题(C 风格编码和询问实现定义的行为)。 AFAIK 标准没有指定返回值的放置位置。如果它们被丢弃,那么无处可去。你可以去挖掘生成的程序集,在你给定的机器/编译器上找到答案
  • @VladyslavRehan retCharPtr 的堆栈帧将在返回时被销毁(及其所有内容)。现在,这是在汇编中实现为 leave (据我所知,这将把内存留在那里),还是将内存返回给内核 C++ 没有指定。编译器可以做任何事情,而你正在访问你不应该访问的内存
  • 自从您询问 last question 以来,处理此问题的正确方法没有改变。

标签: c++ arrays function pointers memory


【解决方案1】:

当函数返回一个值时,该值作为局部变量存在于调用者的当前作用域内(无论调用者是否使用它),并且当变量超出作用域时将被销毁。因此,在您的示例中,在 << 语句之后的 ; 上销毁了返回的 char* 指针(但不是指向的数据)。

retCharPtr() 中,数组存储在函数范围内的自动内存中。当retCharPtr() 退出时,该内存超出范围并被销毁。因此retCharPtr() 返回一个指向无效内存的悬空 指针。如果调用者尝试使用该指针读取数据,它将调用未定义行为

retCharPtr1() 中,数组存储在动态内存中,并且在内存被显式delete[]'ed 之前一直存在。如果调用者没有在返回的指针上调用delete[],那么retCharPtr1()分配的内存就会被泄露。

两种情况下的解决方案都是返回 std::string 而不是 char*。让编译器和std::string为你管理内存。

【讨论】:

  • 正如我上面所说,调用retCharPtr() 不是UB。输出它返回的地址不是UB。 读取它返回的地址虽然是UB。 (我想说的是,“展览”这个词是不准确的。)
  • @Peter-ReinstateMonica 已修复
  • 另一件事是,虽然深入讨论超出了这个问题的范围,但不删除动态内存并不直接意味着它被泄漏:从技术上讲,它仅在最后一个指向它丢失了。即使这样,对于不具有服务器特性的程序(即那些只做一项工作并退出的程序)也可以提出很好的论据,以便根本不费心释放并将其留给操作系统,除非我在嵌入式系统上(无论如何动态分配都是有限的)。
猜你喜欢
  • 2021-05-07
  • 2011-01-12
  • 1970-01-01
  • 2012-12-12
  • 2021-06-25
  • 2021-11-30
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
相关资源
最近更新 更多