簡體   English   中英

將堆分配的引用分配給堆棧分配的變量

[英]assigning a heap allocated reference to a stack allocated variable

這可能嗎? 根據我要完成的工作,似乎並非如此。

功能

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+’

首先,如果您說過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;
}

我在這里猜,因為那是您要的。 當您決定告訴世界“錯誤”的確切含義時,我可能需要修改答案。

我猜你有一個運行時錯誤,因為*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;
}

或者只是根本不使用指針,這樣做沒有任何好處。

std::string *上的operator +表示指針操作, 而不是字符串連接。 不過,您無需跳過任何一個障礙。 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);

我覺得已經有了一個標准的庫函數來實現此目的,盡管我不能馬上想到它。

您試圖將兩個指針加在一起,這就是為什么它不會編譯的原因。 不要忘記指針是一個內存地址,在您的示例中不會調用+ operator -您必須取消引用該指針,但是在這種情況下,我不建議您使用該模式。 我建議您多讀一些有關指針和引用的內容:-)

刪除內存時要非常小心。 從分配內存的上下文中刪除內存是一種不好的做法-這是產生錯誤的秘訣。 另外,如果在調用“ delete str”之前在堆棧上進行了分配,則應用程序可能會崩潰。

對於字符串操作,我真的建議通過const引用傳遞。 這樣就可以為您處理內存分配,因為您可以按值傳遞std :: string,並且它將在內部根據需要執行內存分配...

還有兩點。 在C語言中,我們通常從'0'開始計數,因此我將更改for循環。在適當的應用程序中,我將對您的輸入參數進行一些調試聲明:即,您應聲明num_times為'> 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM