powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Попытка чтения или записи в защищенную память.
12 сообщений из 37, страница 2 из 2
Попытка чтения или записи в защищенную память.
    #38648647
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavluhaНет, до этого момента ошибок нет.
они просто не проявились
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38648898
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha... но я уверен ошибки периодически возникают
Отсюда вопрос, чем это грозит?Грозить это может потерей данных.

Для понимания что, где и когда может ломаться, приводите весь код с первого вызова, до того, где происходит ошибка.
И ещё конечно, объявления функций библиотеки.
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38649446
Factorize
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex KuznetsovFactorize
Factorizeпропущено...


Не советуйте человеку всякие методы написания извращенного кода. Типичный bad practice.Поясните, пожалуйста, почему же это будет методом написания извращённого кода, и как Вы определили, что это "Типичный bad practice" ?
Хочется узнать экспертное мнение.

Хочется узнать ответ именно от Вас, а не отсылания в гугл и т.д.

Может чего нового для себя открою.

За такой код нужно бить по рукам. Использование byte вместо int - это потенциальный баг замедленного действия. Системы имеют свойство развиваться, и за byte значение рано или поздно переползет. Я не раз и не два видел такой баг в продакшене.
Второе - использование byte наведет на мысль, что она для чего-то тут нужен, только сбивает столку. Вы пишите, что это стрельба по воробьям - но в чем она состоит то? Это микрооптимизация. Что она есть, что ее нет - все работает одинаково. За такие оптимизации на языках высокого уровня, если они проводятся без особой надобности, нужно бить по рукам.
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38649465
Factorize
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavluhaВот добился я, что на моей машине все работает корректно, но толку.
Пошел на 32 разрядную винду, запустил и все фатал полный.
Что за х...

Блин, да это стопудофф с разрядностью у вас нелады.
Проверьте, чему у вас равен авторIntPtr.Size.. IntPtr - это коварный тип, внутри сидит указатель разного размера.
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38649770
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Factorize...Использование byte вместо int - это потенциальный баг замедленного действия. Системы имеют свойство развиваться, и за byte значение рано или поздно переползет. Я не раз и не два видел такой баг в продакшене.
Да, такое возможно, только тогда нужно избавиться от магических чисел [1..6] в коде, т.е. переработать немного архитектуру.

FactorizeВторое - использование byte наведет на мысль, что она для чего-то тут нужен, только сбивает столку. Вы пишите, что это стрельба по воробьям - но в чем она состоит то? Это микрооптимизация. Что она есть, что ее нет - все работает одинаково.
За такие оптимизации на языках высокого уровня, если они проводятся без особой надобности, нужно бить по рукам.
Про микрооптимизацию согласен, исследования ассемблерного кода вот такого примера:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
  System.SysUtils;

var
  i: integer;
  ii: integer;
  b: Byte;
  a: integer;
  StatusBuf: array [1 .. 10] of integer;

Function GetStatusNumI(Num: integer): integer;
begin
  if Num in [1 .. 6] // <-- Магические числа ?
  then
    GetStatusNumI := StatusBuf[Num]
  else
    GetStatusNumI := 0;
end;

Function GetStatusNumB(Num: Byte): integer;
begin
  if Num in [1 .. 6] // <-- Магические числа ?
  then
    GetStatusNumB := StatusBuf[Num]
  else
    GetStatusNumB := 0;
end;

begin
    for i := 1 to 10 do
      StatusBuf[i] := i;

    ii := $00000001;
    b := $04;
    Readln;
    a:=GetStatusNumI(ii);
    Writeln('GetStatusNumI(ii) = ', a);

    a:=GetStatusNumB(b);
    Writeln('GetStatusNumB(b) = ', a);
    Readln;
end.

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

Честно, думал, что для вычисления адреса просто применят add .
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38666318
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У коллег использующих библиотеку возникла ошибка чтения\записи в защищенную память при запуске проекта, как релиз.
Но, если запустить проект по админом ошибки нет. =-O

С чем это может быть связано?
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38666403
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я нашел откуда ноги растут:

Вот этот метод бьет память:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
[DllImport("Azimuth.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, EntryPoint = "GetFldStr")]
        public static extern IntPtr _GetFldStr(byte Num, IntPtr Field);
        public static string GetFldStr(byte Num, string Field)
        {
            String val = string.Empty;
            try
            {
                IntPtr pfield = Marshal.StringToHGlobalAnsi(Field);

                IntPtr pstr = _GetFldStr(Num, pfield);
                val = Marshal.PtrToStringAnsi(pstr);

                Marshal.FreeHGlobal(pstr);
                Marshal.FreeHGlobal(pfield);
            }
            catch (Exception)
            {
            }
            return val;
        }



Если закомментарить этот кусок кода:
Код: c#
1.
2.
                Marshal.FreeHGlobal(pstr);
                Marshal.FreeHGlobal(pfield);



То ошибки не возникает, но тогда я память не освобождаю. Как быть?
В дебаге на этих методах происходит ошибка: This may be due to a corruption of the heap, which indicates a bug in or any of the DLLs it has loaded.
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38666417
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha,

pfield - можно и освободить.

с pstr - дела хуже, маловероятно, что GetFldStr возвращает память, выделенную GlobalAlloc

значит будет утекать
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38666438
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,

Как я понял, беда вообще в том, что я пустую строку передаю, от этого и все проблемы.
Вот описание метода

2-й параметр вообще непонятно что такое и что в него передавать. Если я правильно понимаю, то ссылку на обл куда будет сохранено значение.
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38666528
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha2-й параметр вообще непонятно что такое и что в него передавать. Если я правильно понимаю, то ссылку на обл куда будет сохранено значение.
как раз теперь понятно - это блок памяти, в который помещается результат и адрес этого блока возвращается функцией

выделить память под второй параметр с запасом, вызвать, проверить результат на Zero, скопировать строку,
освободить память(один единственный раз)
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38666546
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,

Так и сделал, все заработало. Просто есть методы, которые возвращаю буфер макс размером 32000. И сколько под такое резервировать тогда?
...
Рейтинг: 0 / 0
Попытка чтения или записи в защищенную память.
    #38666582
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavluhaИзопропил,

Так и сделал, все заработало. Просто есть методы, которые возвращаю буфер макс размером 32000. И сколько под такое резервировать тогда?
если узнать заранее невозможно - всегда резервируйте максимум
32000 - это не так много

PS ну и освобождать нужно в блоке finally
...
Рейтинг: 0 / 0
12 сообщений из 37, страница 2 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Попытка чтения или записи в защищенную память.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]