首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个班有双免险吗?

这个班有双免险吗?
EN

Stack Overflow用户
提问于 2016-11-15 20:46:42
回答 1查看 72关注 0票数 0

我编写了一个简单的缓冲区类,它包含一个缓冲区,并提供一个函数来反转缓冲区的内容。

Buffer.h

代码语言:javascript
复制
#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

Buffer.cc

代码语言:javascript
复制
#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的程序,它逐字节反转文件字节的内容,然后输出到一个新文件。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-15 20:58:29

考虑禁止显式复制,如果允许编译器生成隐式复制构造函数,则可以通过两个共享缓冲区指针的对象实现双空闲。否则,我看不出会发生双重自由。您可以在C++11中这样做:

代码语言:javascript
复制
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)定义为非操作.所以

代码语言:javascript
复制
if(this -> buffer != NULL)
    free(this -> buffer);

可能只是:

代码语言:javascript
复制
free(this -> buffer);

2.

代码语言:javascript
复制
tmp = (char)tmpb[i];

为什么选在这里?tmpb[i]应该已经是char了。作为一个普遍的经验法则,大多数情况下,你觉得需要投,这可能意味着有一个更好的方式来完成这项任务。当然也有例外,但是干净的代码应该有最小的转换。

3.

有什么理由不只是在反向函数中使用std::swap(tmpb[size - i - 1], tmpb[i])呢?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40619388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档