Чтобы ответить на ваш первый вопрос, самое лучшее, что вы можете получить, чтобы убедиться, что это правильно, - это внедрить в него тестовый комплект для выполнения какой-то простой задачи и убедиться, что вы получаете ожидаемое поведение. Для меня это намного лучше, если код верен, чем мнение случайного человека, читающего его.
Что касается вашего второго вопроса, вы обходите вокруг delete , выдавая ошибку подтверждения, устанавливая pointer на какое-либо значение маркера после его первого удаления. Что-то вроде:
if (pointer) {
delete pointer;
pointer = NULL;
} else {
error("Attempted to free already freed pointer.");
}
Проблема, с которой вы здесь столкнетесь, состоит в том, что ваш перегруженный оператор -> возвращает значение указателя, что означает, что тот, кому вы его возвращаете, может также вызвать delete , вызывая предложенную мной проверку выше не работать. Например:
simple_ptr<int> myPtr = someIntPointer;
...
delete myPtr.operator->(); /* poof goes your pointered memory region */
Я мог бы порекомендовать вам не полагаться на перегрузку оператора -> , а просто потребовать, чтобы те, кто использует этот класс, вызывали метод, который разыменовывает указатель внутри перед передачей этого значения обратно пользователю.
Надеюсь, это поможет.