Я пытаюсь получить указатель на ячейку памяти. Затем, если я изменю оригинал, назначенная переменная, указывающая на то же место, также должна быть затронута изменением.
Но дело в том, что есть два вызова функций, которые происходят в режиме онлайн:
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 байтов. - person mch   schedule 28.12.2020_size
здесь не имеет значения. Атм. Что важно, так этоmove operator
. - person   schedule 28.12.2020dptr
— это простоconst char*
. Ваш оператор присваивания перемещения буквально заменяет указатель, хранящийся какlocal_data
, другим значением. Я даже не собираюсь пытаться понять, для чего вы хотите это сделать, но один способ (весьма сомнительный) сделать это — заставитьdata()
вернутьconst char *&
(т. е. ссылку на элемент, а не копию его Имейте в виду, это ужасная идея и рецепт для висящей ссылки. - person WhozCraig   schedule 28.12.2020