Class 类型分段错误
Class type Segmentation Fault
好久没用c++了,有些基本的错误。你能告诉我为什么我的通用代码会出现分段错误吗?
当我将 int 用作数组类型时,它工作得很好,但是当我将其更改为 "Trapdoor" 类型时,它会给我段错误。
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 class
#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
class 没有正确的复制构造函数或复制赋值运算符。因此,当按值复制对象时,旧对象和新对象都会调用析构函数,指针会被释放两次等等。
让您的 class 在它没有 new
的事情上调用 delete
很少是一个好的设计。您的代码需要明确谁负责释放内存。
通常,最好的解决方案是编码 Trapdoor
,这样它实际上根本不需要任何 delete
;那么您不必编写任何特殊功能。参见 Rule of three/five/zero。 (如果您显示您的 class 定义,我将更新此 post 以包含代码示例)。
好久没用c++了,有些基本的错误。你能告诉我为什么我的通用代码会出现分段错误吗? 当我将 int 用作数组类型时,它工作得很好,但是当我将其更改为 "Trapdoor" 类型时,它会给我段错误。
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 class
#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
class 没有正确的复制构造函数或复制赋值运算符。因此,当按值复制对象时,旧对象和新对象都会调用析构函数,指针会被释放两次等等。
让您的 class 在它没有 new
的事情上调用 delete
很少是一个好的设计。您的代码需要明确谁负责释放内存。
通常,最好的解决方案是编码 Trapdoor
,这样它实际上根本不需要任何 delete
;那么您不必编写任何特殊功能。参见 Rule of three/five/zero。 (如果您显示您的 class 定义,我将更新此 post 以包含代码示例)。