"使用&创建指向成员的指针"当使用c_str时

时间:2017-03-16 09:24:33

标签: c++

我试图通过将字符串转换为字符串来将char *添加到char *的向量中。以下是我使用的代码:

vector<char*> actionLog;

// lots of code

int value = ...

// lots of code

string str = "string";
cout << str << value << endl;
str += std::to_string(player->scrap);
actionLog.push_back(str.c_str());

问题是我得到了指定的&#34;使用&amp;创建指向成员的指针&#34; push_back行的错误。 str.c_str应该返回一个char *,它是actionLog使用的类型。关于c_str如何工作或者做错其他事情我都不正确。推动行动日志

actionLog.push_back("something");

工作正常,但不是我提到的。我做错了什么?

编辑:我实际上是使用c_str()作为函数,我只是错误地复制了它

4 个答案:

答案 0 :(得分:5)

您尝试做的事实上存在几个问题。

  1. 首先,c_str功能成员。您必须使用()str.c_str()
  2. 来调用它
  3. c_str()会返回const char*,因此您无法将其存储在vector<char*>中。这样你就无法通过改变它内部的方式来打破std::string
  4. 你真的不应该存储c_str()的结果。只有在对const进行非std::string操作之前,它才有效。即如果您对std::string的内容进行了更改,请尝试使用vector中的相应元素,Undefined Behaviour!从您展示示例的方式来看,string的生命周期看起来比vector的生命周期短得多,因此vector会指向某个甚至不再存在。
  5. 也许最好只使用std::vector<std::string>。如果您在此之后不再需要原始string,则您甚至可以将其std::move加入vector,并避免额外复制。

    顺便说一句,请重新考虑您对通常被视为不良做法的使用:using namespace std;endl(这些是解释的链接)。后者有点争议,但至少理解为什么并做出明智的决定。

答案 1 :(得分:2)

std::basic_string::c_str()成员函数,而不是数据成员 - 您需要使用()调用它。

正确的代码是:

actionLog.push_back(str.c_str());

请注意,std::basic_string::c_str()会返回指向const char的指针 - 您的actionLog向量应为std::vector<const char*>类型。

答案 2 :(得分:1)

维托里奥的回答告诉你你在细节上做错了什么。但我认为,你所做错的事情首先是使用vector<char*>而不是vector<string>

使用指针向量,你必须担心底层字符串的生命周期,关于它们失效,从你下面改变,等等。名称actionLog表明该事物是长寿的,并且您用来添加它的代码表明str是用于构建日志字符串的本地帮助器变量,而不是其他任何内容。当str超出范围时,向量包含一个悬空指针。

将矢量更改为vector<string>,执行actionLog.push_back(str),不要担心生命或失效。

答案 3 :(得分:0)

您忘了(),c_str是一个方法,而不是数据成员。只需写下actionLog.push_back(str.c_str());

即可