나는 T 타입의 "stuff"를 저장하는 템플릿 클래스 인 myFoo를 가지고 있는데, 원시 타입이거나 복잡한 타입을 가리키는 포인터 일 수 있습니다. myFoo가 삭제되면 저장되는 모든 것과 관련된 모든 메모리를 해제하려고합니다. 즉, 저장되는 모든 포인터에 대해 delete를 호출해야하지만 결국에는 프리미티브에서 delete를 호출 할 수도 있습니다. 이거 안전한가요 ??프리미티브에서 delete를 호출 할 수 있습니까?
나는 무엇이 진행되고 있는지 더 잘 강조하기 위해 아래 myFoo 스케치를 포함 시켰습니다. 소멸자의 동작이 잘 정의되어 있는지 확실하지 않습니다.
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;
}
포인터를 전문으로 할 수 없습니까? – chris
서면에 따르면, 코드는 * 의미있는 의미로 * 모든 * 유형 'T'에 대해 이해가되지 않습니다. 소유권 책임을 뒤섞어 쓰고 있으며 클래스는 유용성, 가독성 및 유지 보수성 악몽이 될 것입니다. 간단히 말해서, 그것은'T '가 무엇인지에 대한 당신의 우려가 아니어야하고, 클라이언트는 자신의 정리 작업을해야합니다 (물론 스마트 포인터를 사용해야합니다). –
@KerrekSB : 나는 종류의 데이터베이스를 쓰고있다. 데이터를 삽입하고 싶습니다. 데이터베이스가 내부에 저장하고있는 물건의 메모리에 대한 소유권을 가져 오는 것이 합리적입니다. 그렇지 않으면 데이터베이스의 모든 데이터를 외부에서 관리해야합니다. 그것은 조금 "wtf ??" 네가 제안하는대로 해. – Daniel