作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以有
struct ResultStructure
{
ResultStructure(const ResultStructure& other)
{
// copy code in here ? using memcpy ? how???
}
ResultStructure& operator=(const ResultStructure& other)
{
if (this != &other) {
// copy code in here ?
}
return *this
}
int length;
char* ptr;
};
void CastData(T item){
for(size_t i = 0 ; i < FuncVec.size(); i++){
T dataCopy = item;
FuncVec[i](dataCopy);
}
}
void CastData(char * data, int length){
for(size_t i = 0 ; i < FuncVec.size(); i++){
char* dataCopy = new char[length];
memcpy(dataCopy, data, length);
FuncVec[i](dataCopy, length);
delete[] dataCopy;
}
}
最佳答案
您可能想解释为什么要手动处理原始内存。好久没做这个了,就是std::string
和 std::vector
设计用于:
struct ResultStructure
{
// nothing else needed
std::string data; // or std::vector<char>
};
// DON'T TRY THIS AT HOME!!
ResultStructure& ResultStructure::operator=(const ResultStructure& rhs)
{
delete[] ptr; // free old ressource
ptr = new char[rhs.length]; // allocate new resourse
std::copy(rhs.ptr, rhs.ptr+rhs.length, ptr; // copy data
length = rhs.length;
}
new
抛出异常? (如果内存耗尽,它可能会抛出
std::bad_alloc
。)那么我们已经删除了旧数据并且没有分配新数据。然而,指针仍然指向旧数据曾经所在的位置(实际上,我认为这是实现定义的,但我还没有看到在删除时更改 ptr 的实现)和类的析构函数(你知道该类将需要一个析构函数,对吗?)然后将尝试删除未分配数据的地址处的一条数据。那是未定义的行为。您可以期望的最好的结果是它会立即崩溃。
struct ResultStructure
{
ResultStructure(const ResultStructure& other)
: ptr(new char[rhs.length]), length(rhs.length)
{
std::copy(rhs.ptr, rhs.ptr+rhs.length, ptr);
}
~ResultStructure() // your class needs this
{
delete[] ptr;
}
ResultStructure& operator=(ResultStructure rhs) // note: passed by copy
{
this->swap(rhs);
return *this
}
void swap(const ResultStruct& rhs)
{
using std::swap;
swap(length, rhs.length);
swap(ptr, rhs.ptr);
}
std::size_t length;
char* ptr;
};
swap
成员函数。按照惯例,一个
swap()
函数从不抛出并且速度很快,最好是 O(1)。
关于c++ - 如何为这种 C++ 结构实现复制运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4848380/
我是一名优秀的程序员,十分优秀!