当前位置: 首页 > 知识库问答 >
问题:

将STD::Memcpy用于非日常可复制类型的对象

韶云瀚
2023-03-14
#include <iostream>
#include <cstring>

using std::cout;
using std::endl;

struct X
{
    int a = 6;
    X(){ }
    X(const X&)
    {
        cout << "X()" << endl;
    }
};

X a;
X b;
int main()
{
    a.a = 10;
    std::memcpy(&b, &a, sizeof(X));
    cout << b.a << endl; //10
}

共有1个答案

江宏深
2023-03-14

你问:

如果我们将该函数应用于一个非可复制类型的对象,我们可能会遇到什么潜在的问题?

下面是一个非常简单的示例,它说明了对非可复制类型的对象使用std::memcpy的问题。

#include <cstring>

struct A
{
   A(int size) : size_(size), data_(new int[size]) {}
   ~A() { delete [] data_; }

   // The copy constructor and the copy assignment operator need
   // to be implemented for the class too. They have been omitted
   // to keep the code here minimal.

   int size_;
   int* data_;
};

int main()
{
   A a1(10);
   A a2(20);
   std::memcpy(&a1, &a2, sizeof(A));

   // When we return from the function, the original data_ of a1
   // is a memory leak. The data_ of a2 is deleted twice.

   return 0;
}
 类似资料:
  • 类型T的对象的对象表示形式是类型T的对象所占用的N个无符号char对象的序列,其中N等于sizeof(T)。类型T的对象的值表示是参与表示类型T的值的一组位。对象表示中不属于值表示的位是填充位。对于基本可复制的类型,值表示形式是对象表示形式中确定值的一组位,该值是实现定义的值集的一个离散元素。 为什么突出显示的句子仅限于可复制的类型?是否因为一个非日常可复制对象的值表示中的一些位可能在其对象表示之

  • 我正在创建一个ios应用程序,它使用一个用flask python编写的服务器,当我连接到服务器注册一个用户时,我的服务器中不断出现一个“NoneType”对象不可订阅错误。py文件。基本上,我的问题是,是什么导致了这个错误,以及我如何能够修复这个错误。此外,如果有人能为我指出不同或更简单的方法的正确方向,我将不胜感激,谢谢! 这是服务器。py文件: 这是我在swft中的寄存器函数: 回溯: 这里

  • 假设您有一个类型的对象和一个适当对齐的内存缓冲区。如果使用从类型的对象复制到数组,这是复制构造还是复制分配? 如果一个类型是基本可复制的,但不是标准布局,可以想象这样的类: 编译器可以将Meow的和存储在的任何部分,甚至可以在中的随机偏移量处,只要它们正确对齐并且不重叠。如果编译器愿意,和的偏移量甚至可以随每个构造随机变化。(如果编译器愿意,可以在之后执行,因为标准只要求相同访问说明符的成员按顺序

  • 如何修复此问题: 如果T不是类类型,而是: 错误:“int”不是类、结构或联合类型24 |使用类型=std::conditional\u tstd::is\u class\u v 所以我不需要尝试调用错误的表达式,但是如何调用呢?

  • 我试过用 但它不能用于像3141592653589793238462643383279502884197169399375这样的数字,我最多需要10^80。你知道吗?让我知道。非常感谢。

  • 问题内容: 我已经为模型和。它们全部由编写User: 我想做的就是复制一个现有的并更新User给其他人。皱纹是我也想复制所有相关模型实例的Book-它所有的和以及! 观察时,事情变得非常棘手不仅需要更新其字段,而且还需要指向新对象! Django是否支持开箱即用的方式?用于复制模型的通用算法是什么样的? 问题答案: 由于删除了CollectedObjects,因此它在Django 1.3中不再起作