Наиболее эффективная замена для IsBadReadPtr?

Вы можете использовать usort() для $array1 и передать $array2 в качестве массива поиска порядка сортировки.

Код: ( Демонстрация )

$array1 = [
    [536870914 => 34213897],
    [536870914 => 34213905],
    [536870915 => 34213921],
    [536870914 => 34213913],
    [536870915 => 34213929],
    [536870917 => 34213937],
    [536870925 => 34218049],
];

$array2 = [
    536870925,
    536870914,
    536870915,
    536870917,
];

usort($array1, function($a, $b) use ($array2) {
    return array_search(key($a), $array2) <=> array_search(key($b), $array2);
});

var_export($array1);

Чтобы сделать этот процесс более эффективным, переверните поисковый массив заранее.

Код: ( Демонстрация )

$array2 = array_flip($array2);

usort($array1, function($a, $b) use ($array2) {
    return $array2[key($a)] <=> $array2[key($b)];
});

var_export($array1);

Если некоторые идентификаторы из массива1 не представлены в массиве2, вам необходимо определить, как эти выбросы должны быть отсортированы. Если вы не настроите пропущенные значения в массиве поиска, вы сгенерируете Уведомления и получите неожиданный результат сортировки.

Вот аналогичный пост, который предлагает некоторые рекомендации по этому вопросу:

https://stackoverflow.com/a/52754080/2943403

8
задан jeffm 1 July 2019 в 17:42
поделиться

6 ответов

ориентированное на многопотоковое исполнение решение было бы хорошо

Я предполагаю, что это - только IsBadWritePtr, который не ориентирован на многопотоковое исполнение.

просто делая memcpy в обработчике исключений

Это эффективно, что IsBadReadPtr делает... и если бы Вы сделали это в своем коде, то затем Ваш код имел бы ту же ошибку как реализация IsBadReadPtr: http://blogs.msdn.com/oldnewthing/archive/2006/09/27/773741.aspx

Править:--

Единственная проблема с IsBadReadPtr, о котором я читал, состоит в том, что неверный указатель мог бы указывать (и таким образом, Вы могли бы случайно затронуть), защитная страница стека. Возможно, Вы могли избежать этой проблемы (и поэтому использовать IsBadReadPtr безопасно):

  • Знайте то, что потоки выполняют в Вашем процессе
  • Знайте, где стопки потоков, и насколько большой они
  • Спуститесь с каждого стека, delberately касающийся каждой страницы стека, по крайней мере, однажды, прежде чем Вы начнете называть isBadReadPtr

Кроме того, некоторые комментарии, связанные с URL выше также, предлагают использовать VirtualQuery.

9
ответ дан 5 December 2019 в 06:24
поделиться

Причина, которую эти функции плохи для использования, состоит в том, что проблема не может быть решена надежно.

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

Скорее всего, функция, которую Вы вызываете на самом деле, ведет себя правильно, и Вы неправильно используете ее. (Не гарантируемый, но это часто имеет место.)

Какая функция - это?

6
ответ дан 5 December 2019 в 06:24
поделиться

Почему Вы не можете назвать API

AfxIsValidAddress ((p), sizeof (тип), ЛОЖЬ));

1
ответ дан 5 December 2019 в 06:24
поделиться

если Вы используете VC ++ затем, я предлагаю использовать Microsoft определенные ключевые слова __ попытка __ кроме к и поймать исключения HW

-1
ответ дан 5 December 2019 в 06:24
поделиться

Я боюсь, что Вам не повезло - нет никакого способа надежно проверить законность указателя. Какой код Microsoft дает Вам неверные подсказки?

-1
ответ дан 5 December 2019 в 06:24
поделиться

Любая реализация проверки законности памяти подвергается тем же constriants, которые делают сбой IsBadReadPtr. Можно ли отправить стек вызовов в качестве примера того, где Вы хотите проверить, что законность памяти указателя передала Вам из Windows? Это могло бы помочь другим людям (включая меня), диагностируют, почему необходимо сделать это во-первых.

0
ответ дан 5 December 2019 в 06:24
поделиться
Другие вопросы по тегам:

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