Недостаточно памяти для продолжения выполнения программы visual studio

Я хочу визуализировать 4 миллиона треугольников в моем программном обеспечении на основе Windows, написанном на Visual Studio C ++ 2010 (сборка в режиме выпуска). Когда я отрисовываю 3,9 миллиона треугольников, общий объем оперативной памяти, используемой программным обеспечением, составляет 400 МБ. Но когда я пытаюсь отобразить 4 миллиона треугольников (всего на 100 КБ больше), система выдает ошибку.

For Example: Point *P = new (std::nothrow) Point[nb_triangles]; //==> «(std::nothrow)» is for catching the run time memory allocation error. (Point is X, Y, Z floats) If(P == NULL) message(«System can’t allocate this much memory.»); // System gives me this error. It means the system can’t reserve huge memory for this operation.

Я должен выделить память для вершин, нормалей лица, нормалей вершин и т. Д.

На самом деле, что я не получаю, так это то, что у меня 8 ГБ оперативной памяти (но в 32-битной Windows XP = 3,2 ГБ памяти), а программное обеспечение просто зарезервировано 400 МБ, свободная память составляет более 1 ГБ, но когда я пытаюсь рендеринг только 100K треугольников больше, это дает мне ошибку. Почему это дает мне ошибку? потому что он все еще имеет более 1 ГБ свободной оперативной памяти?

Ищем утечки памяти силами Visual Studio

Есть ли способ исправить эту проблему, как я могу выделить всю доступную память для моего приложения?
Из-за этой проблемы, я должен ограничить программное обеспечение только для рендеринга 3,9 миллионов треугольников, и это не хорошо.

И еще один вопрос, который у меня возникает: c ++ «новый» оператор для выделения памяти, выдающий мне ошибку, как насчет c «malloc» оператора? может «malloc» решить эту проблему, есть ли разница между этими двумя?

Пожалуйста, ведите меня. Благодарю.

Обновление № 1:

Я много пытался, изменить код, устранить утечки памяти и т. Д., Но я не могу выделить память более 4 миллионов. Невозможно изменить весь мой код на «вектор». Я не могу поменяться на «вектор», теперь я должен придерживаться своей собственной структуры данных с «новым».
Ниже приведены указатели, которые я хочу выделить для визуализации 1 объекта.

P = new points[10000000]; // points is the class with 3 floats X, Y, Z; N = new Norm[10000000]; // Norm is the class with 3 floats X, Y, Z; V = new vNorm[10000000]; // vNorm is the class with 3 floats X, Y, Z; T = new Tri[10000000]; // Tri is the class with 3 integers v1, v2, v3;

Решение

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

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

РЕШЕНИЕ ПРОБЛЕМЫ «В системе недостаточно памяти»

Процесс умирает на OOM, когда он не может выделить виртуальная память больше. Еще одна статистика в Taskmgr, значение размера виртуальной машины. И обычно он умирает не потому, что использовалась вся ВМ, а потому, что не осталось достаточно большой дыры. Утилита VMMap от SysInternals — хороший способ увидеть, как процесс использует свое адресное пространство.

Читайте также:
Получить авторское право на программу

Увеличение адресного пространства виртуальной памяти требует фундаментального пересмотра. Хотя сегодня это легко, просто нацеливайтесь на x64 в качестве целевой платформы. 64-разрядный процесс имеет огромное количество доступного адресного пространства, ограниченного только максимальным размером файла подкачки. Вы можете бездельничать в 32-битном режиме, если вы действительно можете рассчитывать на работу в 64-битной операционной системе, используя параметр компоновщика / LARGEADDRESSAWARE. Что увеличивает размер виртуальной машины с 2 ГБ до 4 ГБ в 64-разрядной операционной системе.

Другие решения

По одному из вопросов:

is there any diffirence between these two?

разница между new и malloc заключается в следующем:

  1. malloc используется в C, malloc выделяет неинициализированную память Выделенная память должна быть освобождена с free ,
  2. new инициализирует выделенную память, вызывая соответствующий конструктор. Память выделена с new должен быть выпущен с delete (который вызывает деструктор). Вам не нужно указывать размер блока памяти, чтобы освободить выделенную память.

Не понятно new а также malloc связаны в соответствии со стандартом (это зависит от того, реализует ли конкретный компилятор new с помощью malloc или нет), поэтому проблема может или не может быть решена путем простой замены new с malloc ,

Из кода, который вы показали, трудно определить причину ошибки. Вы можете попробовать заменить динамический массив vector чтобы увидеть, решит ли это вашу проблему. Между тем, вы можете использовать valgrind чтобы проверить, есть ли у вас утечка памяти в вашем коде (если вы можете каким-то образом перенести свой код в Linux с помощью make-файлов, поскольку, к сожалению, valgrind недоступен в Windows.).

И еще один вопрос, который у меня на уме: c ++ «новый» оператор для выделения памяти, дающий мне> ошибку, как насчет c «malloc» оператора? «malloc» может решить эту проблему, есть ли разница между этими двумя?

Есть различия между malloc а также new , например, new инициализирует вашу память и автоматически вызовет конструктор класса. Или инициализировать, если они являются примитивными типами (такими как float , int , char так далее). Также память выделяется new должны быть удалены с delete Ключевое слово, которое вызывает деструктор.

C о malloc() так же как new оператор в Visual Studio внутренний вызов HeapAlloc() , HeapAlloc() звонки VirtualAlloc() если требуемая память слишком велика или разделена между процессами. Таким образом, это не обязательно решит вашу проблему. Infact, если вы используете C ++ придерживаться использования new ,

Источник: web-answers.ru

Недостаточно памяти для продолжения выполнения программы VisualStudio

Я только что создал программу на C# .net, и теперь я получаю эту ошибку в окне сообщения, когда я пытаюсь сохранить или отладить ее. Это код, который у меня есть для моего проекта. Код ошибки «Недостаточно памяти для продолжения выполнения программы», пожалуйста, помогите.

if (PS3.GetCurrentAPI() == SelectAPI.ControlConsole) < MessageBox.Show(«Successfully Connected To PS3», «Success», MessageBoxButtons.OK, MessageBoxIcon.Asterisk); connectstuslbl1.Text = » Status: Connected»; connectstuslbl1.ForeColor = Color.Green; PS3.CCAPI.RingBuzzer(CCAPI.BuzzerMode.Single); PS3.CCAPI.Notify(CCAPI.NotifyIcon.TROPHY4, «Successfully Connected To PS3»); attachButton.Enabled = true; disconnectButton.Enabled = false; MySyn.SpeakAsync(richTextBox1.Text); // read the text that inside the Rich Text Box >else if (PS3.GetCurrentAPI() == SelectAPI.TargetManager) < MessageBox.Show(«Connected», «Success», MessageBoxButtons.OK, MessageBoxIcon.Asterisk); connectstuslbl1.Text = » Status: Connected»; connectstuslbl1.ForeColor = Color.Green; attachButton.Enabled = true; disconnectButton.Enabled = false; MySyn.SpeakAsync(richTextBox1.Text); // read the text that inside the Rich Text Box >> catch < MessageBox.Show(«Something is wrong please try again :/», «Error», MessageBoxButtons.OK, MessageBoxIcon.Error); connectstuslbl1.Text = «Failed To Connect»; connectstuslbl1.ForeColor = Color.Red; >> private void flatButton2_Click(object sender, EventArgs e) < try < if (!PS3.AttachProcess())//what this does is runs a error code if theres nothing there, so instead of it saying «Connected» like some tools do it will say ERROR. < attachmentLabel2.Text = «Failed To Attach»; attachmentLabel2.ForeColor = Color.Red; return; >if (PS3.GetCurrentAPI() == SelectAPI.ControlConsole) < PS3.CCAPI.RingBuzzer(CCAPI.BuzzerMode.Double); >attachmentLabel2.Text = «Status: Attached»; attachmentLabel2.ForeColor = Color.Green; MessageBox.Show(«HatedRTMtool», «Success», MessageBoxButtons.OK, MessageBoxIcon.Asterisk); disconnectButton.Enabled = true; MySyn.SpeakAsync(richTextBox2.Text); // read the text that inside the Rich Text Box > catch < attachmentLabel2.Text = «Failed To Attach»; attachmentLabel2.ForeColor = Color.Red; PS3.CCAPI.Notify(CCAPI.NotifyIcon.TROPHY4, «Failed To Attach :/»); >> private void flatToggle1_CheckedChanged(object sender) < if (this.flatToggle1.Checked) < byte[] ON = new byte[] < 0x2C, 0x03, 0x00, 0x01 >;//redbox PS3.SetMemory(0x1AF110, ON); > else < byte[] OFF = new byte[] < 0x2C, 0x03, 0x00, 0x00 >; PS3.SetMemory(0x1AF110, OFF); > > private void flatToggle2_CheckedChanged(object sender) < if (this.flatToggle2.Checked) < byte[] ON = new byte[] < 0x6B, 0x18, 0x00, 0x00 >; //advanced uav PS3.SetMemory(0x1A6A98, ON); > else < byte[] OFF = new byte[] < 0x6B, 0x18, 0x00, 0x01 >; PS3.SetMemory(0x1A6A98, OFF); > > private void flatToggle3_CheckedChanged(object sender) < if (this.flatToggle3.Checked) < byte[] ON = new byte[] < 0x2C, 0x12, 0x00, 0x01 >;//lazer PS3.SetMemory(0x21B6B4, ON); > else < byte[] OFF = new byte[] < 0x2C, 0x12, 0x00, 0x00 >; PS3.SetMemory(0x21B6B4, OFF); > > private void flatToggle4_CheckedChanged(object sender) < if (this.flatToggle4.Checked) < byte[] ON = new byte[] < 0x2C, 0x83, 0x00, 0x00 >;//small crosshair PS3.SetMemory(0x187294, ON); > else < byte[] OFF = new byte[] < 0x2C, 0x83, 0x00, 0x02 >; PS3.SetMemory(0x187294, OFF); > > private void flatToggle5_CheckedChanged(object sender) < if (this.flatToggle5.Checked) < byte[] ON = new byte[] < 0x60, 0x00, 0x00, 0x00 >;//no recoil PS3.SetMemory(0x228930, ON); > > private void flatToggle6_CheckedChanged(object sender) < if (this.flatToggle6.Checked) < byte[] ON = new byte[] < 0x2C, 0x03, 0x00, 0x01 >;//green player PS3.SetMemory(0x60087C, ON); > else < byte[] OFF = new byte[] < 0x2C, 0x03, 0x00, 0x00 >; PS3.SetMemory(0x60087C, OFF); > > private void flatToggle7_CheckedChanged(object sender) < if (this.flatToggle7.Checked) < byte[] ON = new byte[] < 0x38, 0xC0, 0x00, 0x09 >;//wall hack PS3.SetMemory(0x1DDBD0, ON); > else < byte[] OFF = new byte[] < 0x63, 0xE6, 0x00, 0x00 >; PS3.SetMemory(0x1DDBD0, OFF); > > private void flatButton1_Click_1(object sender, EventArgs e) < byte[] bytes = BitConverter.GetBytes((int)this.flatNumeric1.Value); PS3.SetMemory((uint)Stats.AWPrestige, bytes); //Prestige >private void flatButton2_Click_1(object sender, EventArgs e) < byte[] buffer6 = BitConverter.GetBytes((int)this.flatNumeric2.Value); PS3.SetMemory((uint)Stats.AWScore, buffer6); //Score >private void flatButton10_Click(object sender, EventArgs e) < byte[] buffer289 = BitConverter.GetBytes((int)this.flatNumeric3.Value); PS3.SetMemory((uint)Stats.AWWins, buffer289); //Wins >private void flatButton11_Click(object sender, EventArgs e) < byte[] buffer3 = BitConverter.GetBytes((int)this.flatNumeric4.Value); PS3.SetMemory((uint)Stats.AWLosses, buffer3); //Losses >private void flatButton12_Click(object sender, EventArgs e) < byte[] buffer4 = BitConverter.GetBytes((int)this.flatNumeric5.Value); PS3.SetMemory((uint)Stats.AWKills, buffer4); //Kills >private void flatButton13_Click(object sender, EventArgs e) < byte[] buffer5 = BitConverter.GetBytes((int)this.flatNumeric6.Value); PS3.SetMemory((uint)Stats.AWDeaths, buffer5); //Deaths >private void flatButton14_Click(object sender, EventArgs e) < byte[] buffer7 = BitConverter.GetBytes((int)this.flatNumeric7.Value); PS3.SetMemory((uint)Stats.AWGamePlayed, buffer7); //Games Played >private void flatButton8_Click(object sender, EventArgs e) < byte[] buffer8 = BitConverter.GetBytes((int)this.flatNumeric8.Value); PS3.SetMemory((uint)Stats.AWAccuracy, buffer8); //Accuracy >private void flatButton6_Click(object sender, EventArgs e) < flatNumeric2.Value = 3240000; //Score flatNumeric3.Value = 7000; //Wins flatNumeric4.Value = 20000; //Losses flatNumeric5.Value = 30000; //Kills flatNumeric6.Value = 100000; //Deaths >private void flatButton7_Click(object sender, EventArgs e) < >private void flatButton3_Click(object sender, EventArgs e) < byte[] buffer = new byte[0x1770]; for (int i = 0; i < 0x1770; i++) < buffer[i] = 0xfe; >PS3.SetMemory(Stats.AWUnlockAll, buffer); > private void flatButton4_Click(object sender, EventArgs e) < flatNumeric2.Value = 44046576; //Score flatNumeric3.Value = 17059; //Wins flatNumeric4.Value = 6038; //Losses flatNumeric5.Value = 408940; //Kills flatNumeric6.Value = 152470; //Deaths flatNumeric1.Value = 15; //Prestige >private void flatButton5_Click(object sender, EventArgs e) < byte[] buffer = new byte[0x1770]; for (int i = 0; i < 0x1770; i++) < buffer[i] = 0xfe; >PS3.SetMemory(Stats.AWUnlockAll, buffer);//level 50 > private void flatButton7_Click_1(object sender, EventArgs e) < //time played byte[] buffer13 = new byte[4]; PS3.GetMemory(Stats.AWTimePlayed, buffer13); int num = BitConverter.ToInt32(buffer13, 0); int num2 = ((num / 60) / 60) / 0x18; int num3 = ((num / 60) / 60) % 0x18; int num4 = (num / 60) % 60; this.flatNumeric9.Value = num2; this.flatNumeric10.Value = num3; this.flatNumeric11.Value = num4; >private void flatButton21_Click(object sender, EventArgs e) < PS3.Extension.WriteString(Stats.AWClasse1, flatTextBox1.Text); >private void flatButton16_Click(object sender, EventArgs e) < >private void flatButton15_Click(object sender, EventArgs e) < >private void flatButton17_Click(object sender, EventArgs e) < >private void flatButton18_Click(object sender, EventArgs e) < >private void flatButton19_Click(object sender, EventArgs e) < >private void flatButton20_Click(object sender, EventArgs e) < >private void flatButton22_Click(object sender, EventArgs e) < >private void flatButton23_Click(object sender, EventArgs e) < >private void flatButton24_Click(object sender, EventArgs e) < >>
user5842555 14 фев ’16 в 20:52 2016-02-14 20:52
2016-02-14 20:52

Читайте также:
Программа как сделать аву

3 ответа

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

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

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

Чтобы немедленно решить эту проблему, обратитесь в службу поддержки клиентов Microsoft, чтобы получить исправление. Полный список телефонных номеров службы поддержки пользователей Microsoft и информацию о стоимости поддержки можно найти на следующем веб-сайте Microsoft: http://support.microsoft.com/contactus/?ws=support

user5058218 14 фев ’16 в 21:04 2016-02-14 21:04
2016-02-14 21:04

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

user5752473 07 июл ’21 в 13:00 2021-07-07 13:00
2021-07-07 13:00

Я взял основной проект и обновился до новой версии .dotNet (Project, Project Properties, [Application], Target FrameWork -> .net Framework 4.8)/x86. После этого произошла ошибка ~.

Я обнаружил, что несколько связанных классов были на разных платформах.

Редактирование каждого из связанных классов (отдельно) и обновление их до одного и того же .dotNet, похоже, решило эту проблему. [Я думаю] Подтвердите, что каждый из них является одним и тем же x86/x64.

Обязательно сохраните каждый (класс/вкладку) и закройте каждый.

Visual Studio по-прежнему будет аварийно завершать работу с ошибкой ~.

TaskManager Visual Studio и убить редактор.
Перезагрузите проект. После этого повел себя.

(Из комментария выше я полагаю, что только диспетчер задач/завершение визуальной студии и повторный запуск могли решить проблему, но я сделал описанные выше шаги, которые казались разумными.)

Читайте также:
Название программ по психологии

Источник: stackru.com

Недостаточно памяти для продолжения выполнения программы visual studio

Есть такая консольная программа:

/* Консольное приложение, при вызове функции: system(«tasklist») ; выдает ошибку: » Недостаточно памяти для завершения операции.» Почему? */ #include #include int main(int argc, char* argv[])
список директорий командой DIR Том в устройстве C имеет метку WINDOWS 8 Серийный номер тома: E0B6-D250 Содержимое папки C:Userszzz000DocumentsVisual Studio 2012ProjectstestAndH elloWordstestSystemtestSystem 01.12.2013 16:30 . 01.12.2013 16:30 .. 01.12.2013 16:29 Debug 01.12.2013 16:13 2*644 ReadMe.txt 01.12.2013 17:09 Release 01.12.2013 17:09 424 testSystem.cpp 01.12.2013 16:30 4*214 testSystem.vcxproj 01.12.2013 16:15 1*113 testSystem.vcxproj.filters 4 файлов 8*395 байт 4 папок 820*450*492*416 байт свободно список процессов командой TASKLIST Ошибка: Недостаточно памяти для завершения операции. Для продолжения нажмите любую клавишу . . .

Почему выдается ошибка «Недостаточно памяти для завершения операции.» ? Как с этим быть?

Памяти использовано 12%, при выполнении tasklist в консоле cmd.exe или в far`е , все нормально. Для сборки пробовал стандартные конфигурации «debug» и «release», только отключил поддержку предварительно откомпилированных заголовков и убрал stdafx.h.

ОС — Windows 8 (Версия 6.2 (сборка 9200) )
Visual Studio Ultimate 2012

Источник: www.programmersforum.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru