Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/100: Рейтинг темы: голосов - 100, средняя оценка - 4.77
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315

Работа с памятью

26.09.2010, 12:25. Показов 19326. Ответов 57

Студворк — интернет-сервис помощи студентам
Как можно "выделить" и освободить память?
нужно 2-мя способами: с помощью Си шарпа и с помощью апи функций, помогите плз
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.09.2010, 12:25
Ответы с готовыми решениями:

Работа с памятью
Добрый день всем. Я только начал изучение C#(раньше работал c: C++ маленько - т.е. общее представление о нем имею) и у меня вопрос, можно...

Работа с памятью
Есть приложение, которое запускает другое приложение. Нужно чтобы приложение 1 получило от приложения 2 какие-то данные (1 раз). Ни какой...

Работа с памятью
Всем добрый день. У меня появился такой вопрос: Предположим, есть такой код: AnotherObj GetAO() { SomethingObj A = new...

57
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
28.09.2010, 17:38
Студворк — интернет-сервис помощи студентам
На дельфе там пару строк всего...
ты издеваешься чтоль?

на С# выделить память - не WinApi функция
C#
1
IntPtr pMem = Marshal.AllocHGlobal(4096);
на делфи выделить память - не WinApi функция
C#
1
<Переменная> := GlobalAllocPtr(GMEM_FIXED, <Размер памяти>);
как с помощью винапи сделать тоже самое написал SSTREGG

на делфи значит параметр GMEM_FIXED тебя ясен и ты знаешь зачем он, а на C# параметр GMEM_FIXED уже неизвестен?
0
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
28.09.2010, 17:45  [ТС]
Я дельфу терпеть не могу и разбираться в ней даже не собираюсь, в методичке написано типа это апишными функциями оно делается, а что такое там фиксед и т.д я хз вообще

Добавлено через 5 минут
с маршалом работает мне теперь с алок птр-м надо
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8729 / 3681 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
28.09.2010, 18:05
23Alex24, читать книжки. Всё было объяснено не единожды + существует MSDN.
0
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
28.09.2010, 18:26  [ТС]
Да блин в этом мсдн-е нормально не объяснено, и книг нормальных очень мало где хорошо объясняют, вы все такие умные каким то макаром поняли а объяснить по человечески язык не поворачивается, объяснять уж по простому надо чтоб понятно было а не мудреным сленгом пользоваться...
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8729 / 3681 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
28.09.2010, 18:47
Цитата Сообщение от 23Alex24 Посмотреть сообщение
вы все такие умные каким то макаром поняли а объяснить по человечески язык
Я приводил примеры читая MSDN.
[DllImport("kernel32.dll", SetLastError = true)] что такое сетласт ерор?
Можешь убрать.
static extern IntPtr GlobalAlloc(GlobalAllocFlags uFlags, ulong dwBytes); зачем тут флагс?
Читай описание функции в MSDN. Это можно заменить на uint uFlags, но тогда нужно объявлять константы.
static extern IntPtr GlobalFree(IntPtr hGlobal); - ш глобал это что? или зачем?
Это не знание языка.
[Flags]
enum GlobalAllocFlags : uint
{
GHND = 0x0042U,
GMEM_FIXED = 0x0000U,
GMEM_MOVEABLE = 0x0002U,
GMEM_ZEROINIT = 0x0040U,
GPTR = 0x0040U
}
Перечисления, для использования взамен констант.
IntPtr pMemory = GlobalAlloc(GlobalAllocFlags.GMEM_FIXED, 4096UL); здесь 4096UL это что?
Для этого надо почитать азы.
1
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
28.09.2010, 18:49  [ТС]
Какую книгу лучше читать чтобы понять Вин апи? те которые скачивал там либо чистый винапи чтоли идет, либо с С++
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8729 / 3681 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
28.09.2010, 18:50
Другого ты не найдешь. Книжки на подобии "WinApi в C#" не существует.
1
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
28.09.2010, 18:51  [ТС]
Ясно, спс
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
28.09.2010, 19:21
по моему в мелкософтовском хелпе довольно таки прекрасно все описано. Надо только не ленится читать.
0
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
28.09.2010, 21:08  [ТС]
А никто не ленится, что за мелкософтовский хелп?
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8729 / 3681 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
28.09.2010, 21:30
MSDN называется.
0
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
28.09.2010, 21:31  [ТС]
Не, там написано далеко не для новичков....
0
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
02.10.2010, 16:11  [ТС]
Ну как всегда: все можно было сделать гораздо проще чем говорят:
C#
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
 
namespace LabaNumbOne
{
    public partial class Form1 : Form
    {
        IntPtr memoryHndlrApi;
        IntPtr memorySize;
        //апи функция для просмотра памяти
        [DllImport("kernel32.dll")]
        //для выделения памяти
        public static extern IntPtr GlobalAlloc(int con, int size);
        [DllImport("kernel32.dll")]
       //для освобождения
        public static extern int GlobalFree(IntPtr start);
        [DllImport("kernel32.dll")]
        public static extern void GlobalMemoryStatus(ref MEMORYSTATUS lpBuffer);
        //
        public struct MEMORYSTATUS
        {
            public UInt32 dwLength;               //Размер структуры, в байтах-хз че это
            public UInt32 dwMemoryLoad;           //процент занятой памяти
            public UInt32 dwTotalPhys;            //общее кол-во физической(оперативной) памяти
            public UInt32 dwAvailPhys;            //свободное кол-во физической(оперативной) памяти
            public UInt32 dwTotalPageFile;        //предел памяти для системы или текущего процесса
            public UInt32 dwAvailPageFile;        //Максимальный объем памяти,который текущий процесс может передать в байтах.
            public UInt32 dwTotalVirtual;         //общее количество виртуальной памяти(файл подкачки)
            public UInt32 dwAvailVirtual;         //свободное количество виртуальной памяти(файл подкачки)
            public UInt32 dwAvailExtendedVirtual; //Зарезервировано. Постоянно 0.
        }
        //функция для считывания памяти
        public void ShowMemory()
        {
            //объявляем переменную типа мемористатус
            MEMORYSTATUS memStatus = new MEMORYSTATUS();
            //вызываем функцию с аргументом мемори статус
            GlobalMemoryStatus(ref memStatus);
 
            //записываем в текстбоксы значения оперативной памяти
            tBObshRazmFizPam.Text = ((Convert.ToInt32(memStatus.dwTotalPhys)) / 1024/1024).ToString()+" "+"Мегабайт";
            tBDostypnRazmFizPam.Text = ((Convert.ToInt32(memStatus.dwAvailPhys)) / 1024 / 1024).ToString() + " " + "Мегабайт";
            //записываем в текстбоксы значения виртуальной памяти
            tBObshRazmVirtPam.Text = ((Convert.ToInt32(memStatus.dwTotalVirtual)) / 1024 /1024).ToString() + " " + "Мегабайт";
            tBDostypnRazmVirtPam.Text = ((Convert.ToInt32(memStatus.dwAvailVirtual)) / 1024 / 1024).ToString() + " " + "Мегабайт";
            //процент занятой памяти
            tbProcentZanjatojPam.Text = (memStatus.dwMemoryLoad).ToString() + " " + "%";
 
        }
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            ShowMemory();
        }
 
        private void API_Click(object sender, EventArgs e)
        {
            memoryHndlrApi = GlobalAlloc(0, 1024*1024*125);//выделяем память
        }
 
        private void CSharpVidelenie_Click(object sender, EventArgs e)
        {
            memorySize = Marshal.AllocHGlobal( 1024*1024*125 );// выделяем не апишными
        }
 
        private void CSharpOsvobogdenie_Click(object sender, EventArgs e)
        {
            Marshal.FreeHGlobal(memorySize);//освобождаем не апишными
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            GlobalFree(memoryHndlrApi);//освобождаем апишными
        }
    }
}
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8729 / 3681 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
02.10.2010, 17:33
Твой пример ничем не отличается от того что давал тебе я на протяжении всей темы. Мой код был только более читабельным. К тому же ты не принимаешь в сведение советы которые тебе давали...
0
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
02.10.2010, 19:06  [ТС]
ВОТ это:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr GlobalAlloc(GlobalAllocFlags uFlags, ulong dwBytes);
 
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr GlobalFree(IntPtr hGlobal);
 
[Flags]
enum GlobalAllocFlags : uint
{
    GHND = 0x0042U,
    GMEM_FIXED = 0x0000U,
    GMEM_MOVEABLE = 0x0002U,
    GMEM_ZEROINIT = 0x0040U,
    GPTR = 0x0040U
}
...
IntPtr pMemory = GlobalAlloc(GlobalAllocFlags.GMEM_FIXED, 4096UL);
{
 
}
GlobalFree(pMemory);
и вот это:
C#
1
2
3
4
5
6
7
IntPtr memoryHndlrApi;
IntPtr memorySize;
public static extern int GlobalFree(IntPtr start);
[DllImport("kernel32.dll")]
public static extern void GlobalMemoryStatus(ref MEMORYSTATUS lpBuffer);
memoryHndlrApi = GlobalAlloc(0, 1024*1024*125);
GlobalFree(memoryHndlrApi);
Это называется одно и тоже???? и читабельность лучше.. ну ну, усложнено почем зря было
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8729 / 3681 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
02.10.2010, 21:57
Когда будешь работать в команде поймешь...
0
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
02.10.2010, 22:03  [ТС]
Эта ветка ведь не зря называется " для начинающих" Чем изначально проще объяснить, тем быстрее человек въедет в тему)
0
02.10.2010, 22:07

Не по теме:

Извини, но так и рождается говнокод :(

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.10.2010, 22:07

Работа с памятью
Переместить массив размерностью 16 ячеек из области памяти с начальным адресом 900 в область памяти с начальным адресом А00, изменив...

Работа с памятью
Здравствуйте. Прошу скинуть любые примеры записи/чтения/редактирования данных из/в память. Заранее спасибо. :)

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

AForge и работа с памятью
Добрых времени суток. При использовании AForge для захвата картинки с вебкамеры память начинает улетать буквально на глазах. За 5 секунд...

Работа напрямую с памятью
Такая проблема: есть структура Struct {int a,int b} еще есть две строки требуется скопировать структуру, а сразу за ней две строки в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
58
Ответ Создать тему
Новые блоги и статьи
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ По ссылке 403. Не очень информативно такую ссылку постить. Запись от Usaga размещена Сегодня в 06:46 . . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru