我有權訪問一個類(不是我寫的),它將const char*
作爲構造函數中的參數。如果我有一個字符串,我想傳遞值作爲參數,傳遞它的安全方式是什麼,請記住字符串和類對象可能有不同的作用域?將字符串作爲常量字符傳遞*
我沒有訪問該類的源代碼,所以不要認爲它的做法像將字符串複製到類成員中一樣健全。
舉一個具體的例子,這不起作用:
#include <iostream>
#include <string>
class example {
public:
example(const char*);
const char* str;
};
example::example(const char* a) : str(a) {}
int main() {
std::string* a=new std::string("a");
example thisDoesntWork(a->c_str());
std::cout << thisDoesntWork.str << std::endl;
delete a;
std::cout << thisDoesntWork.str << std::endl; //The pointer is now invalid
a=new std::string("b");
std::cout << thisDoesntWork.str << std::endl;
}
這個工作(只要我可以告訴)更換構造函數,但顯然是很可怕:
example thisDoesWorkButIsAwful((new const std::string(*a))->c_str()); //Memory leak!
同樣:
char* buffer=new char[a->size()+1];
strcpy(buffer,a->c_str()); //with #include <string.h> added up top
example(buffer);
但是,這又容易發生內存泄漏。
我目前的主要想法是製作一個圍繞example
的包裝類,它將字符串複製到char *
緩衝區,並在超出範圍時刪除緩衝區,但看起來有點過分。有更簡單/更好的方法嗎?
更糟糕的是,它可能會承擔指針的所有權,並嘗試稍後「釋放」它。這是特別有趣的,如果你傳遞一個字符串文字,雖然我想這樣的行爲是不是在C API以外的常見:) – melak47
@ melak47我(很漂亮)確定它至少沒有這樣做。儘管在這一點上我很少會感到驚訝。 ;) – Chris