[英]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_rep
和str
都是指針,並且您要相互添加一個指針,但是它們指向的是什么? 如果要附加字符串,請執行以下操作:
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.