主頁 > .NET開發 > 我怎樣才能解決這個問題?“在正常塊后檢測到堆損壞。CRT檢測到應用程式在堆緩沖區結束后寫入記憶體”

我怎樣才能解決這個問題?“在正常塊后檢測到堆損壞。CRT檢測到應用程式在堆緩沖區結束后寫入記憶體”

2022-04-01 21:52:28 .NET開發

我有一個使用參考的程式運行良好(沒有提示錯誤),但我決定使用分配在虛擬記憶體上的指標到指標陣列,因為我可以使用變數作為陣列的大小。

當我打破while (m_Window.isOpen())回圈時,即當我關閉游戲視窗并且游戲結束時,會提示錯誤。我注意到當我嘗試擦除Engine::cleanVirtualMemory()函式中的虛擬記憶體時程式會中斷。我注意到它在那里是因為我放了兩個標志(cout << "running1" << endl;cout << "running2" << endl),我可以只顯示第一個標志。

然后它會提示一個帶有以下訊息的視窗:

HEAP CORRUPTION DETECTED after normal block.. CRT 檢測到應用程式在堆緩沖區結束后寫入記憶體

主檔案

#include "Engine.h"
using namespace sf;

int main(){

    Engine Motor;
    Motor.run();
    Motor.cleanVirtualMemory();
}

引擎.h

#pragma once
#include <SFML/Graphics.hpp>
#include "StructureBuilder.h"

using namespace sf;
using namespace std;

class Engine{
private:

    // Lots of variables ....
    Vector2i m_ArenaSize;
    Vector2f * vectorStructureArray = new Vector2f[m_ArenaSize.y * m_ArenaSize.x * 4];
    int** logicStructureArray = new int*[m_ArenaSize.y];
    // Lots of variables ....

    //Gameloop
    void Input();
    void Update(dtAsSeconds);
    void Draw();

public:

    Engine();
    void run();
    void cleanVirtualMemory();

};

引擎.cpp

#include "Engine.h"
#include <iostream>

using namespace sf;


Engine::Engine() {

/// lots of variables and data ...

/// Making arena
m_ArenaSize = Vector2i(10, 10);
StructureBuilder(arenaStructures, vectorStructureArray, logicStructureArray,  m_ArenaSize);
}


void Engine::run() {

//Timing
Clock clock;
while (m_Window.isOpen()) {

    // Each time clock restarted, dt = time elapse (from 0 to now, then clock = 0)
    Time dt = clock.restart();

    // Convert time elapse to seconds
    double dtAsSeconds = dt.asSeconds();
   
    //  Call each part of the game in turn
    Input();
    Update(dtAsSeconds);
    Draw();
    }
}

void Engine::cleanVirtualMemory() {
    // Deallocate Virtual Memory
    
    // first flag
    cout << "running1" << endl;

    for (int i = m_ArenaSize.x - 1; i > -1; i--) {
        delete[] logicStructureArray[i];
    }
    delete[] logicStructureArray;
    logicStructureArray = NULL;
    delete[] vectorStructureArray;
    vectorStructureArray = NULL;

   // second flag
   cout << "running2" << endl;
}

結構生成器.h

#pragma once
#include <SFML/Graphics.hpp>
#include <iostream>
#include <string.h>

using namespace sf;
using namespace std;

Vector2i StructureBuilder(VertexArray& rVA, Vector2f* rA, int** rLA, Vector2i ArenaSize);

In the following code, you can see where I use pointers, I have erased code just to simplify.

StructureBuilder.cpp

#include "StructureBuilder.h"

Vector2i StructureBuilder(VertexArray& rVA, Vector2f* rA, int** rLA, Vector2i ArenaSize) {

    //Set map properties and VertexArrayType
    double tileSize = 100;
    double Height = ArenaSize.y * tileSize;
    double angle = 30;
    int offset = 0;
    int Primitive = 4;
    int currentVertex = 0;

    rVA.setPrimitiveType(Quads);
    rVA.resize(ArenaSize.x * ArenaSize.y * 4);

    // First build graphically our map structures's using char strings 
    string stringArray[10]; 
    stringArray[0] = "1000000000";
    stringArray[1] = "0000000000";
    stringArray[2] = "0000010000";
    stringArray[3] = "0000000000";
    stringArray[4] = "0000000000";
    stringArray[5] = "0000000000";
    stringArray[6] = "0000000000";
    stringArray[7] = "0000000000";
    stringArray[8] = "0000000000";
    stringArray[9] = "0000000000";

    // Convert stringArray to charArray, finally charArray to intArray
    char** charArray = new char*[ArenaSize.y]; 

    Vector2f Vector1;
    Vector2f Vector2;
    Vector2f Vector3;
    Vector2f Vector4;

    for (int i = 0; i < ArenaSize.x; i  ) {
       charArray[i] = new char[ArenaSize.x];
       rLA[i] = new int[ArenaSize.x];
        
    }

    for (int i = 0; i < ArenaSize.x; i  ) {
        for (int j = 0; j < ArenaSize.y; j  ) {
            charArray[j][i] = stringArray[j][i];
            rLA[j][i] = charArray[j][i] - 48;

            // Check when we have a value greater or equal to 1, if yes build a structure.
            if (rLA[j][i] == 1) {

                
                Vector1 = Vector2f(Value..., Value...);// in order to understand I dont put the whole calculation here
                Vector2 = Vector2f(Value..., Value ...); // is just trigonometry to find vertex
                Vector3 = Vector2f(Value..., Value ...);
                Vector4 = Vector2f(Value..., Value ...);


                rVA[currentVertex   0].position = Vector1;
                rVA[currentVertex   1].position = Vector2;
                rVA[currentVertex   2].position = Vector3;
                rVA[currentVertex   3].position = Vector4;

                rVA[currentVertex   0].texCoords = Vector2f(42, 0); // coords on my spritesheet
                rVA[currentVertex   1].texCoords = Vector2f(86, 24);
                rVA[currentVertex   2].texCoords = Vector2f(42, 49);
                rVA[currentVertex   3].texCoords = Vector2f(0, 24);

                rA[currentVertex   0] = Vector1; //Later I use this to tell the program where to construct restrictions (where the player can't move)
                rA[currentVertex   1] = Vector2;
                rA[currentVertex   2] = Vector3;
                rA[currentVertex   3] = Vector4;
            }
           
            currentVertex = currentVertex   Primitive;
        }
    }

    // Deallocate Virtual Memory
    for (int i = ArenaSize.x - 1; i > -1; i--) {
        delete[] charArray[i];
    }
    delete[] charArray;
    charArray = NULL;


    return ArenaSize;
}

uj5u.com熱心網友回復:

我們來看看Engine類的宣告。

class Engine{
private:

    // Lots of variables ....
    Vector2i m_ArenaSize;
    Vector2f * vectorStructureArray = new Vector2f[m_ArenaSize.y * m_ArenaSize.x * 4];

您班級的第一個成員Engine被稱為m_ArenaSize這是在構造 a 時將構造的第一個類成員Engine這就是 C 中物件構造的作業方式:構造新物件時,新物件的所有成員都按宣告順序構造。

你的類的第二個成員Engine是這個vectorStructureArray指標。它將被分配以指向一個具有動態大小的陣列,該陣列new使用構造m_ArenaSize的兩個自己的成員xy.

現在,讓我們看一下Engine's 的建構式:

Engine::Engine() {

好的。那是你的建構式。因此,根據我們的計劃,將在's 的建構式的初始化部分(這里沒有)中,m_ArenaSize因為它沒有顯式構造,所以將得到默認構造。Engine如果你調查什么m_ArenaSize是默認建構式,你會發現它默認xy0。

這就是構建vectorStructureArray指標的內容,作為Engine默認初始化的第二個業務順序。并且,因為它的xy為 0,指標將指向總共 0 個值。

m_ArenaSize = Vector2i(10, 10);

直到現在,默認構造的才被m_ArenaSize替換為不同的主題,具有不同的xy值。顯示的代碼清楚地期望指標被重新分配,以反映m_ArenaSize新的xy值。但是 C 不能以這種方式作業。vectorStructureArray已經建成。它不會僅僅因為一個不同的類成員被替換而再次構造。后續代碼的假設是新的xy值,這會導致相當明顯的記憶體損壞。

同樣的錯誤logicStructureArray也發生在 .

這些只是所示代碼中有關記憶體分配的前兩個主要錯誤。有幾種方法可以修復它們,但修復錯誤最簡單的方法是讓它們在邏輯上首先不可能發生。如果從不使用new和相關的錯誤,從邏輯上講是不可能發生的。delete現代 C 代碼很少使用newand delete,而是使用 C 庫的許多容器的服務。

在這里,兩個指標都可以簡單地替換為std::vector,其resize()成員負責分配兩個向量的大小。而且,作為額外的獎勵,所有分配的記憶體都會自動釋放,自動防止所有記憶體泄漏。

Replacing all the error-prone new and delete logic with std::vector will fix all memory-related issues in the shown code, the only thing you will have to make sure is that the vectors are correctly resize()d.

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/454247.html

標籤:c pointers sfml dynamic-memory-allocation dynamic-arrays

上一篇:為什么函式內部和函式外部的值不匹配?

下一篇:c :通過參考傳遞陣列

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more