Tôi đang làm việc trong một dự án với một cơ sở mã di sản khổng lồ và đã cố gắng thiết kế lại các bộ phận của nó để thoát khỏi mã c-style cũ.Tại sao dữ liệu kết quả của tôi bị trả về là void * bị hỏng?
Tôi đã gặp sự cố và đã chuẩn bị một chương trình ngắn để giải thích.
Giao diện cũ mà tôi đang sử dụng cần tôi chuyển con trỏ đến dữ liệu kết quả là void * và tôi muốn tránh phải thay đổi điều này.
Unique_ptr trong ví dụ minh họa, trong cơ sở mã thực sự của tôi, mọi thứ hoạt động trên dữ liệu đều sử dụng con trỏ thông minh để quản lý bộ nhớ.
Vấn đề của tôi là dữ liệu kết quả bị hỏng (xem dòng đầu ra cuối cùng/cuộc gọi cuối cùng để printPayload); tất cả mọi thứ là 0 ở cuối, nhưng nó không có vẻ là một vấn đề với chuyển đổi để void * và trở lại như được hiển thị bởi dòng đầu ra thứ 2 và thứ 3.
Đây có phải là sự cố liên quan đến thời gian không? Tôi không nhận được ...
Tôi hy vọng loại vấn đề này có liên quan đến một số bạn.
#include <iostream>
#include <memory>
struct Payload
{
long a;
int b;
int c;
Payload() : a(), b(), c() {}
Payload(long setA, int setB, int setC) : a(setA), b(setB), c(setC) {}
};
void printPayload(const Payload& printThis)
{
std::cout << "payload -- a: " << printThis.a << " b: " << printThis.b << " c: " << printThis.c << std::endl;
}
void doSomething(Payload* sourceData, void* targetData)
{
if (!sourceData) return;
std::unique_ptr<Payload> sourceDataUnique(sourceData);
sourceDataUnique->a = 222;
sourceDataUnique->b = 333;
sourceDataUnique->c = 444;
printPayload(*sourceDataUnique);
targetData = reinterpret_cast<void*>(sourceDataUnique.release());
printPayload(*(reinterpret_cast<Payload*>(targetData)));
}
int main(void)
{
Payload* myPayload = new Payload(14, 8, 1982);
Payload myResult;
printPayload(*myPayload);
doSomething(myPayload, &myResult);
printPayload(myResult);
}
Output:
payload -- a: 14 b: 8 c: 1982
payload -- a: 222 b: 333 c: 444
payload -- a: 222 b: 333 c: 444
payload -- a: 0 b: 0 c: 0
Bạn đặt 'targetData' trong 'doSomething', nhưng thay đổi này là cục bộ cho hàm. Tham số phải là tham chiếu. –
Điều này có thể được đơn giản hóa thành: 'void doSomething (Payload * src, Payload * dst) {dst = src; } ' – melpomene
@PankajDaga, sẽ không hoạt động, vì nó sẽ là tham chiếu đến tạm thời. – StoryTeller