c++ - 类类型段错误

标签 c++ segmentation-fault

我已经很长时间没有使用c++了,我有一些基本的错误。你能告诉我为什么我的通用代码会出现段错误吗? 当我将 int 用作数组类型时,它工作得很好,但是当我将它更改为“Trapdoor”类型时,它会给我 Seg Fault。

array<array<int, colN>, rowN> SmartIds::createMatrix() {
    array<array<int, colN> , rowN> a;
    for(int i = 0; i < rowN; i++) {
        a[i] = createTrapdoors();
    }
//sort(a.begin(), a.end());
    return a;
}

下面的代码会产生段错误

array<array<Trapdoor, colN>, rowN> SmartIds::createMatrix() {
    array<array<Trapdoor, colN> , rowN> a;
    for(int i = 0; i < rowN; i++) {
        a[i] = createTrapdoors();
    }
//sort(a.begin(), a.end());
    return a;
}

我像下面这样调用我的函数;

auto i = createMatrix();

Trapdoor.cpp类

#include "Trapdoor.h"
#include <cryptopp/pwdbased.h>
using namespace std;
Trapdoor::Trapdoor() {
    // TODO Auto-generated constructor stub
    key = nullptr;
    seed = nullptr;
    iv = nullptr;
    counter = 0;
}

Trapdoor::Trapdoor(byte* keyy, byte* ivv) {
    key = keyy;
    seed = keyy;
    iv = ivv;
    counter = 0;
}

Trapdoor::~Trapdoor() {
    // TODO Auto-generated destructor stub
    delete iv;
    delete key;
    delete seed;
}

void Trapdoor::deriveKeywithCounter() {
    SecByteBlock derived(32);
    PKCS5_PBKDF2_HMAC<SHA1> kdf;
    //kdf.DeriveKey(derived.data(), derived.size(), 0, (byte*)b->data(), sizeof(b), NULL, 0, 100);

    memset(iv, 0x00, CryptoPP::AES::DEFAULT_KEYLENGTH);
    counter++;

}

int Trapdoor::getCounter() {
    return counter;
}

最佳答案

Trapdoor 类没有正确的复制构造函数或复制赋值运算符。因此,当按值复制对象时,旧对象和新对象都会调用析构函数,指针会被释放两次等等。

让您的类对它没有new 的事物调用delete 很少是一个好的设计。您的代码需要明确谁负责释放内存。

通常,最好的解决方案是编写 Trapdoor 代码,这样它实际上根本不需要任何 delete;那么您不必编写任何特殊功能。参见 Rule of three/five/zero . (如果您显示您的类定义,我将更新这篇文章以包含代码示例)。

关于c++ - 类类型段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28956829/

相关文章:

c - 带链表的段错误

segmentation-fault - zmq::message_t发送后可以重复使用吗?

c++ - 代码块无法识别它编写的类的标题?

c++ - RegQueryValueEx 函数在 Windows7 上失败

c++ - 从文件中读取 double

C/Pointer - 声明一个局部变量指针而不初始化它

c++ - 如何处理 QThread 上的事件?

c++ - 如果我需要在 header 中使用匿名命名空间怎么办?

c - C 代码行在完全不相关的代码行上导致段错误

c - 二叉树实现在 C 中给我段错误