tùy chọn của tôi không được sử dụng static const
thành viên vì dường như nó luôn tạo ra nhiều khớp nối hơn const
thành viên; đôi khi nhầm lẫn w.r.t phân cấp thừa kế kim cương mà lớp cuối cùng kế thừa từ 2 lớp siêu (lớp 1 được thừa hưởng public
; lớp kia được thừa hưởng virtual public
), sau đó xác định thành viên static const
trỏ đến vùng bộ nhớ động qua new
, malloc
, calloc
v.v. sẽ dẫn đến double free
lỗi.
ví dụ: đây là sản phẩm của một tình huống đơn giản thừa kế kim cương
ray:~ ray$ ./multiinheritance
Base() called
Derived1() called
Base() called
Derived2() called
Final() called
~Final() called
~Derived2() called
~Base() called
freeing memory
~Derived1() called
~Base() called
freeing memory
multiinheritance(475) malloc: *** error for object 0x100150: double free
*** set a breakpoint in malloc_error_break to debug
ray:~ ray$
Dưới đây là các mã:
#include <iostream>
#include <string>
class Base {
public:
Base() {
std::cout << "Base() called " << std::endl;
}
virtual ~Base() {
std::cout << "~Base() called" << std::endl;
std::cout << "freeing memory" << std::endl;
delete i;
}
static const int* i;
};
const int* Base::i = new int[5];
class Derived1 : virtual public Base {
public:
Derived1() {
std::cout << "Derived1() called " << std::endl;
}
virtual ~Derived1() {
std::cout << "~Derived1() called" << std::endl;
}
};
class Derived2 : public Base {
public:
Derived2() {
std::cout << "Derived2() called " << std::endl;
}
virtual ~Derived2() {
std::cout << "~Derived2() called" << std::endl;
}
};
class Final: public Derived1, public Derived2 {
public:
Final() {
std::cout << "Final() called" << std::endl;
}
~Final() {
std::cout << "~Final() called" << std::endl;
}
};
int main(int argc, char** argv) {
Final f;
return 0;
}
Nguồn
2009-12-21 00:47:51
Bằng "sẽ không thay đổi" Tôi có nghĩa là giá trị là như nhau cho tất cả các đối tượng của lớp. – trikker
Trong trường hợp đó bạn không có lý do gì để không làm cho nó trở thành 'static const'. Một const không tĩnh sẽ làm việc tốt (ngoài một số trường hợp cụ thể/kỳ lạ), nhưng nó sẽ dẫn đến sự lãng phí không cần thiết của bộ nhớ. – AnT
Vâng, đó là ý chính của tôi. – trikker