Такой код:
#include <stdint.h>
#include <unistd.h>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
class BinStr {
public:
uint8_t *data;
BinStr() {
this->len = 0;
this->data = NULL;
}
BinStr(const void *data, size_t len) {
this->len = len;
this->data = (uint8_t *)malloc(this->len);
if (this->data == NULL) throw bad_alloc();
memcpy(this->data, data, this->len);
}
BinStr(const BinStr &obj) {
this->len = obj.len;
this->data = (uint8_t *)malloc(this->len);
if (this->data == NULL) throw bad_alloc();
memcpy(this->data, obj.data, this->len);
}
~BinStr() {
free(this->data);
}
size_t size(void) {
return this->len;
}
BinStr &operator+=(const BinStr &right) {
if (this == &right) {
size_t old_len = this->len;
this->len *= 2;
this->data = (uint8_t *)realloc(this->data, this->len);
if (this->data == NULL) throw bad_alloc();
memcpy(this->data + old_len, this->data, old_len);
return *this;
} else {
size_t old_len = this->len;
this->len += right.len;
this->data = (uint8_t *)realloc(this->data, this->len);
if (this->data == NULL) throw bad_alloc();
memcpy(this->data + old_len, right.data, right.len);
return *this;
}
}
const BinStr operator+(const BinStr &right) {
//return (BinStr(this->data, this->len) += right);
//return BinStr(*this) += right;
BinStr ret = *this;
ret += right;
return ret;
}
private:
size_t len;
};
int main(int argc, char **argv) {
BinStr b2("hi\x00""5", 4);
BinStr b3("tell", 4);
BinStr b4 = BinStr();
b4 = b3 + b2;
write(fileno(stdout), b4.data, b4.size());
return 0;
}
выпадает в такой crash dump:
@°î*** glibc detected *** ./a.out: double free or corruption (fasttop): 0x0000000000eeb070 ***
======= Backtrace: =========
/lib/libc.so.6[0x7f3cf6d986c8]
/lib/libc.so.6(cfree+0x76)[0x7f3cf6d9a1d6]
./a.out[0x40103c]
./a.out(__gxx_personality_v0+0x210)[0x400cb0]
/lib/libc.so.6(__libc_start_main+0xe6)[0x7f3cf6d445c6]
./a.out(__gxx_personality_v0+0x59)[0x400af9]
======= Memory map: ========
00400000-00402000 r-xp 00000000 03:03 524302 /home/user/projects/icq/a.out
00601000-00602000 r--p 00001000 03:03 524302 /home/user/projects/icq/a.out
*** и т.д. ***
Беда наступает из-за строчки `b4 = b3 + b2;` в main(), если её убрать или хотя бы заменить на `b3 + b2;`, т.е. без присваивания переменной, crash не происходит.
Насколько я понял из чтения дампа и отладки в дебагере, на каком то объекте destructor вызывается дважды (скорее всего на том который создаётся внутри operator+ т.е. ret).
Внимание вопрос!
Что я делаю не так? Как с этим бороться? Во всех туториалах которые удалось найти в гугле operator+ показывается именно так как у меня, перепробовал множество вариантов (закомментированы), безрезультатно. А может дело то и не в operator+ совсем а в например copy constructor'е.
Вобщем help!!!!