释放从c++中的函数返回的已分配内存

问题描述 投票:0回答:2

我有一个问题找不到答案。

如果我有这样的功能:

char* f1(char ch, int len) { 
    char* s1=new char[len+1); 
    for(int i; i<len; i++) s1[i]=ch; 
    s1[len]=0; 
}

我这样称呼它:

char* str;
str=f1("A", 10);
std:cout << "Something " << str << std::endl;
delete[] str;

一切都好,但如果我想像这样使用它更短:

std:cout << "Something " << f1("A", 10) << std::endl;

我最终会分配到无法释放的内存。 请记住,内存泄漏不好,应该避免 - 有没有办法以正确的方式做到这一点?

尝试在互联网上搜索但没有结果。

考虑创建从函数分配的指针列表,并稍后在某个地方释放它们,但这不是最好/安全的方法,因为它很容易混乱。

c++ memory-management memory-leaks
2个回答
0
投票

您可以像这样使用

std::unique_ptr

#include <memory>
#include <iostream>

typedef std::unique_ptr<char[]> MyPtr;

MyPtr f1(char ch, int len) {
    MyPtr s1(new char[len+1]);
    for(int i=0; i<len; i++) s1[i]=ch;
    s1[len]=0;
    return s1;
}

int main()
{
    std::cout << "Something " << f1('A', 10).get() << std::endl;
}

背景:从

f1
返回的对象在语句结束时被销毁——也就是说,在执行该行之后,当到达
;
时。

当然,归根结底,您应该只使用

std::string
——毕竟,您使用的是 C++...

#include <iostream>
#include <string>

int main()
{
    std::cout << "Something " << std::string(10, 'A') << std::endl;
}

0
投票

您的代码中有几个问题:

  1. f1
    应该返回
    char*
    但不包含
    return
    语句(如
    return s1;
    )。

  2. 您用

    f1
    呼叫
    f1("A", 10)
    。但第一个参数应该是
    char
    而“A”不是。应该是
    f1('A', 10)

  3. 在 C++ 中,不建议使用原始 C 数组。它的问题之一是您遇到的需要手动内存管理。最好使用标准库类,如

    std::vector
    (用于通用动态数组),或者在这种以空结尾的字符数组的情况下 - 使用
    std::string

  4. std::string
    已经有一个构造函数,它接受长度和字符并创建一个字符串,就像你的
    f1
    尝试做的那样,所以你可以简单地使用:

    std::cout << "Something " << std::string(10, 'A') << std::endl;
    

    输出:

    Something AAAAAAAAAA
    

    现场演示

© www.soinside.com 2019 - 2024. All rights reserved.