#include class Managed { public: void *operator new(size_t len) { void *ptr; cudaMallocManaged(&ptr, len); cudaDeviceSynchronize(); return ptr; } void operator delete(void *ptr) { cudaDeviceSynchronize(); cudaFree(ptr); } }; class umString : public Managed { public: int length; char *data; umString() { length = 0; data = 0; } umString(const umString &s) { length = s.length; cudaMallocManaged(&data, length); memcpy(data, s.data, length); } }; int main() { const char *tmp = "Hello"; umString *umString1 = new umString; cudaMallocManaged(&((*umString1).data), 6*sizeof(char)); memcpy((*umString1).data, tmp, 6); (*umString1).length = 6; umString umString2 (*umString1); printf("tmp variable: %s\n", tmp); printf("tmp location: %p\n", (void *)tmp); printf("umString1 value: %s\n", (*umString1).data); printf("umString1 location: %p\n", (void *)(*umString1).data); printf("umString2 value: %s\n", umString2.data); printf("umString2 location: %p\n", (void *)umString2.data); printf("\n\nDeleting umString1...\n\n"); delete umString1; printf("tmp variable: %s\n", tmp); printf("tmp location: %p\n", (void *)tmp); printf("umString1 value: %s\n", (*umString1).data); printf("umString1 location: %p\n", (void *)(*umString1).data); printf("umString2 value: %s\n", umString2.data); printf("umString2 location: %p\n", (void *)umString2.data); }