Tôi có một lớp templated, myFoo, lưu trữ "thứ" của loại T, có thể là nguyên thủy hoặc con trỏ đến các kiểu phức tạp. Khi myFoo bị xóa, tôi muốn giải phóng tất cả bộ nhớ liên quan đến mọi thứ nó xảy ra để lưu trữ. Điều này có nghĩa là tôi cần phải gọi xóa trên mỗi con trỏ được lưu trữ nhưng tôi cũng có thể kết thúc gọi xóa trên một nguyên thủy. Cái này có an toàn không ??Tôi có thể gọi xóa trên tài liệu gốc không?
Tôi đã bao gồm một bản phác thảo của myFoo bên dưới để làm nổi bật những gì đang diễn ra tốt hơn. Tôi không chắc chắn nếu hành vi của destructor được xác định rõ.
template<class T>
class myFoo
{
public:
myFoo(int size)
{
size_ = size;
T* foo = new T[size_];
}
void addFoo(T tmp, int index)
{
foo[index] = tmp;
}
virtual ~myFoo()
{
for(int i=0; i < size_; i++)
{
delete foo[i];
}
delete [] foo;
}
private:
int size_;
T* foo;
}
Bạn không thể chuyên cho con trỏ? – chris
Như được viết, mã của bạn không có ý nghĩa đối với * bất kỳ * loại 'T', ít nhất là ngữ nghĩa: Bạn đang trộn lẫn trách nhiệm quyền sở hữu và lớp học sẽ là một cơn ác mộng khả năng sử dụng, dễ đọc và bảo trì. Trong ngắn hạn, nó không nên được * của bạn * quan tâm những gì 'T' là, và khách hàng nên làm sạch của riêng mình lên (hoặc tất nhiên sử dụng một con trỏ thông minh). –
@KerrekSB: Tôi đang viết một cơ sở dữ liệu các loại. Tôi muốn chèn dữ liệu vào đó. Nó có ý nghĩa cho cơ sở dữ liệu để sở hữu bộ nhớ của những thứ tôi đang lưu trữ bên trong nó. Nếu không, tôi cần phải quản lý tất cả dữ liệu từ cơ sở dữ liệu bên ngoài. Đó là một chút "wtf ??" nếu tôi làm như bạn đề nghị. – Daniel