нулевой размер malloc [дубликат]

У меня есть другое решение: это решение отлично работает, когда у вас есть только контент, который вы хотите показать при входе в систему. Определите правило, в котором вы проверяете, вошли ли вы в систему, а не путь к маршрутам из белого списка.

$urlRouterProvider.rule(function ($injector, $location) {
   var UserService = $injector.get('UserService');
   var path = $location.path(), normalized = path.toLowerCase();

   if (!UserService.isLoggedIn() && path.indexOf('login') === -1) {
     $location.path('/login/signin');
   }
});

В моем примере я спрашиваю, не вошел ли я в систему, и текущий маршрут, который я хочу направить, не является частью `/ login ', потому что мои маршруты из белого списка следующие

/login/signup // registering new user
/login/signin // login to app

, поэтому у меня есть мгновенный доступ к этим двум маршрутам, и любой другой маршрут будет проверен, если вы находитесь в сети.

Вот весь мой файл маршрутизации для модуля входа в систему

export default (
  $stateProvider,
  $locationProvider,
  $urlRouterProvider
) => {

  $stateProvider.state('login', {
    parent: 'app',
    url: '/login',
    abstract: true,
    template: '<ui-view></ui-view>'
  })

  $stateProvider.state('signin', {
    parent: 'login',
    url: '/signin',
    template: '<login-signin-directive></login-signin-directive>'
  });

  $stateProvider.state('lock', {
    parent: 'login',
    url: '/lock',
    template: '<login-lock-directive></login-lock-directive>'
  });

  $stateProvider.state('signup', {
    parent: 'login',
    url: '/signup',
    template: '<login-signup-directive></login-signup-directive>'
  });

  $urlRouterProvider.rule(function ($injector, $location) {
    var UserService = $injector.get('UserService');
    var path = $location.path();

    if (!UserService.isLoggedIn() && path.indexOf('login') === -1) {
         $location.path('/login/signin');
    }
  });

  $urlRouterProvider.otherwise('/error/not-found');
}

() => { /* code */ } - синтаксис ES6, используйте вместо него function() { /* code */ }

45
задан shodanex 2 July 2009 в 08:39
поделиться

6 ответов

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

  • free (NULL) - это нормально, операция не выполняется
  • free (address) - это нормально, если адрес был получен от malloc (или других, таких как calloc и т. Д. .)
59
ответ дан 26 November 2019 в 21:12
поделиться

Разрешено возвращать NULL, и разрешено возвращать указатель, отличный от NULL. вы не можете разыменовать. Оба способа санкционированы стандартом (7.20.3):

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

26
ответ дан 26 November 2019 в 21:12
поделиться

Извините за проблему, мне следовало прочитать страницы руководства:

malloc () выделяет байты размера и возвращает указатель на выделенную память. Память не очищается. Если размер равен 0, то malloc () возвращает либо NULL, либо уникальное значение указателя, которое позже может быть успешно передано в free ().

free () освобождает пространство памяти, на которое указывает ptr, которое должно было быть возвращено предыдущим вызовом malloc (), calloc () или realloc (). В противном случае, или если free (ptr) уже был вызван ранее, возникает неопределенное поведение. Если ptr равен NULL, никакие операции не выполняются.

Кажется, это верно по крайней мере для GNU libc

4
ответ дан 26 November 2019 в 21:12
поделиться

Обновлено с учетом комментариев libt и Pax:

Поведение вызова malloc (0) зависит от реализации или, другими словами, не переносится и не определено.

Ссылка на CFaq вопрос для получения дополнительных сведений.

1
ответ дан 26 November 2019 в 21:12
поделиться

Согласно стандарту c

7.20.3 Если размер запрошенного пространства равен нулю, поведение определяется реализацией: либо возвращается нулевой указатель, либо поведение такое, как если бы размер был некоторым ненулевым значением, за исключением того, что возвращаемый указатель не должен использоваться для доступа к объекту.

3
ответ дан 26 November 2019 в 21:12
поделиться

Хотя это может быть законный C / C ++, это указывает на более серьезные проблемы. Я обычно называю это «неряшливостью указателя».

См. «Не делайте предположений о результате malloc (0) или calloc (0)», https://www.securecoding.cert.org/confluence/display/seccode/VOID+MEMxx-A . + Не + делать + предположения + о + результате + malloc% 280% 29 + или + calloc% 280% 29 .

0
ответ дан 26 November 2019 в 21:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: