构造后 const char* 的值返回空

问题描述

将此 Vector3 转换为 const char* 已在隐式和显式转换中起作用,但在构造时尝试将其转换时却没有。只有这样 const char* 'v3pchar' 返回空白。有什么想法吗?完整代码如下。谢谢!

.save_word2vec_format(path,binary=False)

解决方法

   v3pchar = v3string.c_str();

const char * 返回的 c_str() 指针归其 std::string 所有,并且仅在 std::string 被修改或被销毁之前有效,以先到者为准。胶囊摘要:一旦 v3string 被修改或销毁,v3pchar 就不再有效。

   const char* v3 = Vector3(4,5,6);

这会导致以下事件序列:

  1. 创建并构造了一个临时 Vector3 对象。
  2. 它的 operator const char* 方法被调用,并返回一个由内部 const char * 拥有的 std::string,该内部 Vector3const char * 对象的成员。
  3. 返回的 v3 被分配给 Vector3
  4. 临时 std::string 对象及其 const char * 成员被销毁。
  5. 它跟随着最初返回的 std::string 指针不再有效,因为拥有它的 const char * 对象现在已被销毁。

ismemberof(N,H) :- member(N,_,H),!. 指针的任何后续使用都会导致未定义的行为。

应该可以修改显示的代码,使用现代 C++ 中的一些特性,这些特性会导致此构造变得格式错误(类方法引用限定符),并让您的 C++ 编译器捕获此常见错误。但那将是另一个问题;至于您观察到的结果的原因:由于上述原因,这是未定义的行为。