This question already has answers here:
What is The Rule of Three?
(8个答案)
3年前关闭。
我编写了一个简单的Buffer类,其中包含一个缓冲区,并提供了一个功能来反转缓冲区的内容。
缓冲液
缓冲液
有一个远程服务器可以使用故障注入来测试我的实现。该服务器向我报告,存在由双重释放或损坏引起的错误。我已经阅读了很多次实现,但是找不到该错误的运气。我无权访问该服务器。有什么帮助吗?
注意:我必须使用C样式代码。否则我将无法通过服务器测试。这是一个硬性要求。好吧,您可能认为此要求很愚蠢。但这是必要条件。也许有一点是在有人将C和C ++混合使用时学习到的不好。
服务器提供了一项主要功能来测试我的实现。
对于想查看所有代码的任何人,您都可以从https://mega.nz/#!FhoHQD5Y!iD9tIZMNtKPpxfZTpL2KWoUJRedbw6wToh6QfVvzOjU下载一个zip文件。只需使用
一些小注意事项:
1。
标准将
可以是:
2。
为什么在这里投?
3。
有什么理由不只在反向函数中使用
(8个答案)
3年前关闭。
我编写了一个简单的Buffer类,其中包含一个缓冲区,并提供了一个功能来反转缓冲区的内容。
缓冲液
#ifndef __BUFFER_H__
#define __BUFFER_H__
#include <stdlib.h>
#include <cerrno>
#include <stdio.h>
class Buffer
{
private:
char * buffer;
int size;
public:
Buffer(int size);
~Buffer();
void reverse(int size);
};
#endif
缓冲液
#include "Buffer.h"
Buffer::Buffer(int size)
{
this -> size = size;
this -> buffer = (char *)malloc(size);
if(this -> buffer == NULL)
throw 1;
}
Buffer::~Buffer()
{
if(this -> buffer != NULL)
free(this -> buffer);
}
void Buffer::reverse(int size)
{
char tmp;
int i;
char * tmpb = this -> buffer;
for(i = 0; i < size / 2; i++)
{
tmp = (char)tmpb[i];
tmpb[i] = tmpb[size - i - 1];
// printf("exchange %x with %x\n", tmp & 0xff, tmpb[i] & 0xff);
tmpb[size - i - 1] = tmp;
}
}
有一个远程服务器可以使用故障注入来测试我的实现。该服务器向我报告,存在由双重释放或损坏引起的错误。我已经阅读了很多次实现,但是找不到该错误的运气。我无权访问该服务器。有什么帮助吗?
注意:我必须使用C样式代码。否则我将无法通过服务器测试。这是一个硬性要求。好吧,您可能认为此要求很愚蠢。但这是必要条件。也许有一点是在有人将C和C ++混合使用时学习到的不好。
服务器提供了一项主要功能来测试我的实现。
对于想查看所有代码的任何人,您都可以从https://mega.nz/#!FhoHQD5Y!iD9tIZMNtKPpxfZTpL2KWoUJRedbw6wToh6QfVvzOjU下载一个zip文件。只需使用
make
进行编译。结果是名为rcopy
的程序,该程序逐字节反转文件的内容,然后输出到新文件。 最佳答案
考虑显式禁止复制,如果允许编译器生成隐式副本构造函数,则它可以通过共享缓冲区指针的两个对象来实现双重释放。否则,我认为不可能发生双重释放。您可以像这样在C ++ 11中做到这一点:
class Buffer {
private:
char *buffer;
int size;
public:
Buffer(int size);
Buffer(const Buffer &) = delete;
Buffer &operator=Buffer(const Buffer &) = delete;
~Buffer();
void reverse(int size);
};
一些小注意事项:
1。
标准将
free(NULL)
定义为不可操作。所以if(this -> buffer != NULL)
free(this -> buffer);
可以是:
free(this -> buffer);
2。
tmp = (char)tmpb[i];
为什么在这里投?
tmpb[i]
应该已经是char
。作为一般的经验法则,在大多数情况下,您觉得有必要进行投射,这可能意味着有更好的方法来完成任务。当然也有例外,但是干净的代码应尽量减少强制转换。3。
有什么理由不只在反向函数中使用
std::swap(tmpb[size - i - 1], tmpb[i])
吗?关于c++ - 此类中是否有双重免费风险,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40619388/
10-13 04:06