Какова “утверждать” функция?

Или Вы могли следовать за подходом COM-выхода и применить простой подсчет ссылок.

  • при создании объекта дайте ему ссылочное значение 1 немедленно
  • , Когда любой получает копию указателя, они AddRef ()
  • , Когда любой бросает их копию указателя, они Выпуск ()

, Если подсчет ссылок совершает нападки 0, объект удаляет себя.

в конечном счете, что shared_ptr делает под капотом, но это дает Вам больше контроля тем, что продолжается, и по моему опыту легче отладить. (Его также очень межплатформенный).

я не дал shared_ ptr слишком много шанса в моей разработке пока еще, так, чтобы мог служить Вашим целям отлично.

246
задан Keith Thompson 25 June 2013 в 07:51
поделиться

5 ответов

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 () и отсутствия гарантии что-либо делать,

284
ответ дан 23 November 2019 в 03:04
поделиться

Такие вещи, как «вызывает исключение» и «останавливает выполнение», могут быть верны для большинства компиляторов, но не для всех. (Кстати, существуют ли операторы 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-битным границам, поэтому компилятор может генерировать специальные инструкции, сделанные для такого типа выравнивания.

4
ответ дан 23 November 2019 в 03:04
поделиться

Это функция, которая останавливает выполнение программы, если вычисленное значение ложно. Обычно он окружен макросом, поэтому он не компилируется в результирующий двоичный файл при компиляции с настройками выпуска.

Он предназначен для проверки сделанных вами предположений. Например:

void strcpy(char* dest, char* src){
    //pointers shouldn't be null
    assert(dest!=null);
    assert(src!=null);

    //copy string
    while(*dest++ = *src++);
}

В идеале, вы хотите, чтобы вы могли сделать ошибку в своей программе, например, вызвать функцию с недопустимыми аргументами, и нажать assert до того, как она перестанет работать (или не сможет работать должным образом)

0
ответ дан 23 November 2019 в 03:04
поделиться

Оператор компьютера assert аналогичен оператору make sure ] на английском языке.

103
ответ дан 23 November 2019 в 03:04
поделиться

Взгляните на пример программы

assert () на C ++

Многие компиляторы предлагают 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
13
ответ дан 23 November 2019 в 03:04
поделиться