【发布时间】:2021-04-05 05:48:08
【问题描述】:
我试图有一个指向内存位置的指针。 然后,如果我修改原始分配的变量 指向相同位置的人也必须受到更改的影响。
但是,问题是,有两个函数调用是在线发生的:
a = Data("New data");
-
Data(const char* cdata)构造函数被调用。 -
调用了
Data operator=(Data&& data)移动运算符。
编辑:我知道以下内容:
- std::shared_ptr
- std::make_shared
但是,我正在尝试在没有这些新功能的情况下实现这一目标。我很清楚。
我的 C++ 代码:
class Data
{
private:
char* local_data;
int _size = 0;
int length(const char* c)
{
int i = 0;
while(c[++i] != '\0');
return i;
}
public:
Data() {
local_data = new char[_size];
}
Data(const char* cdata){
_size = length(cdata);
local_data = new char[_size];
memcpy(local_data, cdata, _size);
}
int size() { return _size; }
char* data() { return local_data; }
const char* data() const { return local_data; }
Data& operator=(const Data& data){}
Data& operator=(Data&& data){
if(this == &data)
return *this;
_size = std::move(data.size());
local_data = std::move(data.data());
return *this;
}
};
int main(){
Data a("Some data");
auto dptr = a.data(); // Gives a pointer to the original location
a = Data("New data"); // Must modify both a and dptr
assert(dptr == a.data()); // Should pass successfully, else fail
return 0;
}
【问题讨论】:
-
_size始终是0,因此您总是分配 0 个字节并复制 0 个字节。 -
这里的
_size部分无关紧要。自动取款机。相关的是move operator。 -
“必须同时修改 a 和 dptr” - 移动语义不会发生这种情况。
dptr是一个普通的const char*。您的移动赋值运算符实际上是用不同的值替换作为local_data保存的指针。我什至不会尝试了解您到底想要做什么,但是可以(非常值得怀疑)的一种方法是让data()返回const char *&(即对成员的引用而不是其值的副本。请注意;这是一个糟糕的想法,也是悬空引用的秘诀。 -
@WhozCraig,谢谢。我不想要悬空指针或内存泄漏。
-
“这里的 _size 部分无关紧要。”,所以不要在 M(inital)CVE 中包含它。