问题描述
将此 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);
这会导致以下事件序列:
- 创建并构造了一个临时
Vector3
对象。 - 它的
operator const char*
方法被调用,并返回一个由内部const char *
拥有的std::string
,该内部Vector3
是const char *
对象的成员。 - 返回的
v3
被分配给Vector3
。 - 临时
std::string
对象及其const char *
成员被销毁。 - 它跟随着最初返回的
std::string
指针不再有效,因为拥有它的const char *
对象现在已被销毁。
此 ismemberof(N,H) :- member(N,_,H),!.
指针的任何后续使用都会导致未定义的行为。
应该可以修改显示的代码,使用现代 C++ 中的一些特性,这些特性会导致此构造变得格式错误(类方法引用限定符),并让您的 C++ 编译器捕获此常见错误。但那将是另一个问题;至于您观察到的结果的原因:由于上述原因,这是未定义的行为。