将堆分配的引用分配给堆栈分配的变量

时间:2011-12-11 23:08:11

标签: c++ memory pointers stack heap

这可能吗?根据我想要完成的事情,似乎并非如此。

功能

static std::string str_repeat(std::string * str, int num_times) {

    std::string * str_rep = new std::string;

    for (int n = 1; n <= num_times; n++) {
        str_rep = str_rep + str;
    }

    std::string ret = *str_rep; //error

    delete str;
    delete str_rep;

    return ret;
}

更新

抱歉,我没有首先发布错误,因为我认为这是一个普遍的C ++问题,我做错了。在这里。

error: invalid operands of types ‘std::string* {aka std::basic_string<char>*}’ and ‘std::string* {aka std::basic_string<char>*}’ to binary ‘operator+’

4 个答案:

答案 0 :(得分:7)

首先,如果您说new std::string,那么您可能会做错事。此代码中不应包含任何指针(str_rep = str_rep + str是代码中的指针算法,而不是附加,这就是解除引用结果失败的原因。)

std::string str_repeat(const std::string& str, int num_times) {
    std::string ret;
    for (int n = 0; n < num_times; ++n) {
        ret += str;
    }
    return ret;
}

答案 1 :(得分:1)

我在这里猜测,因为这就是你要求的。当你决定告诉全世界“错误”的含义时,我可能需要修改答案。

我猜你有一个运行时错误,因为*str_rep是垃圾。

因为这部分是垃圾:

for (int n = 1; n <= num_times; n++) {
    str_rep = str_rep + str;
}

str_repstr都是指针,你正在向另一个添加一个,但它们指向的是什么?如果要附加字符串,请执行:

for (int n = 1; n <= num_times; n++) {
    *str_rep = *str_rep + *str;
}

或者根本不使用指针,这样做没有任何好处。

答案 2 :(得分:1)

operator +上的

std::string *表示指针操作,字符串连接。你不需要跳过任何一个篮球; std::string将在内部为其内容分配足够大的缓冲区。将您的功能更改为:

static std::string str_repeat(const std::string& str, int num_times) {
    std::string result("");

    for (int n = 1; n <= num_times; n++) {
        result += str;
    }

    return result;
}

并调用它传入正确的字符串,而不是字符串的地址:

std::string myString(...);
std::string str = str_repeat(myString, 10);
std::string str2 = str_repeat("foobar", 100);

我觉得已经有一个标准的库函数正是为了这个目的,尽管我无法想到它。

答案 3 :(得分:1)

您正在尝试将两个指针添加到一起,这就是它不会编译的原因。不要忘记指针是一个内存地址,在你的例子中不会调用+运算符 - 你必须取消引用指针,但我不建议在这种情况下使用该模式。我建议你阅读一些关于指针和参考文献的内容: - )

删除内存时要非常小心。删除内存远离分配它的上下文是不好的做法 - 这是一个bug的配方。此外,如果您在调用'delete str'之前在堆栈上分配,您的应用程序可能会崩溃。

对于字符串操作,我建议通过const引用传递。因此,将为您处理内存分配,因为您可以按值传递std :: string,并且它将在内部根据需要执行内存分配...

另外两点。 在C语言中,我们通常从'0'开始计数,所以我会改变你的for循环 在适当的应用程序中,我会在输入参数上有一些调试断言:即你应断言num_times是'&gt; 0'

以下代码使用结果“barbarbar”编译并执行...

干杯,祝你好运, 乔恩

#include <string>
#include <iostream>

using namespace std;

static string str_repeat(const string& str, int count)
{
    string returnData;

    for (int n = 0; n < count; n++)
    {
        returnData.append(str);
    }

    return returnData;
}

int main(int argc, char* argv[])
{
    string foo = "bar";

    string duplicated = str_repeat(foo, 3);

    cout << duplicated;

    return 0;
}