Или Вы могли следовать за подходом COM-выхода и применить простой подсчет ссылок.
, Если подсчет ссылок совершает нападки 0, объект удаляет себя.
в конечном счете, что shared_ptr делает под капотом, но это дает Вам больше контроля тем, что продолжается, и по моему опыту легче отладить. (Его также очень межплатформенный).
я не дал shared_ ptr слишком много шанса в моей разработке пока еще, так, чтобы мог служить Вашим целям отлично.
assert
завершит программу (обычно с сообщением, цитирующим оператор assert), если ее аргумент окажется ложным. Обычно это используется во время отладки, чтобы сделать программу более очевидной при возникновении непредвиденных ситуаций.
Например:
assert(length >= 0); // die if length is negative.
Вы также можете добавить более информативное сообщение, которое будет отображаться в случае сбоя, например:
assert(length >= 0 && "Whoops, length can't possibly be negative! (didn't we just check 10 lines ago?) Tell jsmith");
Или еще как это:
assert(("Length can't possibly be negative! Tell jsmith", length >= 0));
Когда вы делаете сборку выпуска (без отладки), вы также можете удалить накладные расходы на оценку операторов assert
, определив макрос NDEBUG
, обычно с помощью переключатель компилятора. Следствием этого является то, что ваша программа не должна никогда полагаться на запущенный макрос assert.
// BAD
assert(x++);
// GOOD
assert(x);
x++;
// Watch out! Depends on the function:
assert(foo());
// Here's a safer way:
int ret = foo();
assert(ret);
Из-за комбинации вызова программы abort () и отсутствия гарантии что-либо делать,
Такие вещи, как «вызывает исключение» и «останавливает выполнение», могут быть верны для большинства компиляторов, но не для всех. (Кстати, существуют ли операторы assert, которые действительно генерируют исключения?)
Вот интересное, немного другое значение assert, используемое c6x и другими компиляторами TI: увидев определенные операторы assert, эти компиляторы используют информацию из этого оператора для выполнения определенных оптимизации. Wicked.
Пример на C:
int dot_product(short *x, short *y, short z)
{
int sum = 0
int i;
assert( ( (int)(x) & 0x3 ) == 0 );
assert( ( (int)(y) & 0x3 ) == 0 );
for( i = 0 ; i < z ; ++i )
sum += x[ i ] * y[ i ];
return sum;
}
Это сообщает компилятору, что массивы выровнены по 32-битным границам, поэтому компилятор может генерировать специальные инструкции, сделанные для такого типа выравнивания.
Это функция, которая останавливает выполнение программы, если вычисленное значение ложно. Обычно он окружен макросом, поэтому он не компилируется в результирующий двоичный файл при компиляции с настройками выпуска.
Он предназначен для проверки сделанных вами предположений. Например:
void strcpy(char* dest, char* src){
//pointers shouldn't be null
assert(dest!=null);
assert(src!=null);
//copy string
while(*dest++ = *src++);
}
В идеале, вы хотите, чтобы вы могли сделать ошибку в своей программе, например, вызвать функцию с недопустимыми аргументами, и нажать assert до того, как она перестанет работать (или не сможет работать должным образом)
Оператор компьютера assert аналогичен оператору make sure ] на английском языке.
Взгляните на пример программы
Многие компиляторы предлагают assert () макрос. Макрос assert () возвращает TRUE если его параметр имеет значение ИСТИНА и предпринимает какие-то действия, если это оценивает ЛОЖЬ. Многие компиляторы будут прервать программу на assert (), что терпит неудачу; другие вызовут исключение
Одна мощная функция assert () макрос заключается в том, что препроцессор сворачивает его вообще без кода, если DEBUG не определяется. Это отличный помощь во время разработки, и когда конечный продукт отправляется нет снижение производительности или увеличение размер исполняемой версии программа.
Например,
#include <stdio.h>
#include <assert.h>
void analyze (char *, int);
int main(void)
{
char *string = "ABC";
int length = 3;
analyze(string, length);
printf("The string %s is not null or empty, "
"and has length %d \n", string, length);
}
void analyze(char *string, int length)
{
assert(string != NULL); /* cannot be NULL */
assert(*string != '\0'); /* cannot be empty */
assert(length > 0); /* must be positive */
}
/**************** Output should be similar to ******************
The string ABC is not null or empty, and has length 3