Вы должны быть осторожны с оператором new, вызывающим исключение в вашем конструкторе. Если это произойдет, вы должны убедиться, что указатель данных инициализирован для nullptr, в противном случае будет вызван деструктор и попытаться удалить какой-либо случайный адрес.
#include <cstring>
template<typename T>
class string {
protected:
T * data_;
public:
string(T const * data);
~string();
};
template<typename T>
string<T>::string(T const * data)
try {
if(!data) data_ = 0;
else {
data_ = new T[std::strlen(data) + 1];
std::strcpy(data_, data);
}
} catch(...) {
data_ = 0;
}
template<typename T>
string<T>::~string() {
delete[] data_;
}
int main() {
string<char> test("test");
return 0;
}