問題解決 無法建立新的堆疊防護頁面

2021-06-26 21:41:48 字數 1846 閱讀 5618

【問題發現】

專案中需要幾個自定義的控制項,菜鳥d定義了乙個介面,打算使用多型來統一呼叫。在完成兩個自定義控制項後,專案都能正常執行。但是在第三個控制項使用的時候就出了問題:將控制項拖到介面上以後,不能拖動改變控制項的寬度,一拖動就會出現「無法建立新的堆疊防護頁面」的提示,然後vs直接崩潰。後來經過多次嘗試,發現可以輸入改變控制項的寬度,但是依然會有崩潰發生。

【問題解決】

菜鳥d在網上搜尋相關的解決辦法,但是幾乎所有的回答都在說是遞迴呼叫導致溢位。菜鳥d發現自己的程式中有遞迴的呼叫,但是前兩個控制項也是呼叫的這乙個遞迴方法,如果是方法本身的問題,那兩種控制項也一定會出錯,但事實是那兩種控制項可以正常使用的。所以問題一定就在新的自定義控制項上。

由於崩潰是在改變控制項的寬度後發生的,必須看看寬度的屬性,以下是部分**:

recursive call 不就是遞迴麼!!!原來如此,是這裡的遞迴導致了崩潰。刪掉這段**後,控制項隨意拖拉也再沒出現那樣的錯誤了。問題到此已經得到了解決。

【問題的分析】

菜鳥d不明白為什麼這麼寫會造成遞迴,於是開始接下來的查詢。

在get裡面的width上用f12,發現游標只是向上跳了一行,這個好像不對,感覺有點怪。隨即想到既然這是自定義控制項,繼承control控制項類,控制項類裡面會不會做了相應的封裝。於是,轉到定義,以下**展示繼承關係:

public

partial

class

excontrolbox : usercontrol, icontrolcommonable

public

class

usercontrol : containercontrol

public

class

containercontrol : scrollablecontrol, icontainercontrol

public

class

scrollablecontrol : control, icomponent, idisposable

public

class

control : component, idroptarget, isynchronizeinvoke, iwin32window, ibindablecomponent, icomponent, idisposable

//control基類中的兩個屬性

public

int width

public

virtual

string text

果然在control基類裡找到width屬性,當看到text屬性時想起曾經使用過override重寫過text屬性,那是否可以換一種寫法「重寫」width屬性?當然可以——new。new 作為運算子用於建立物件和呼叫建構函式,作為修飾符用於隱藏基類中被繼承的成員(出自msdn)。

於是改造了原來的width屬性的寫法,也能成功執行沒有發生崩潰。**如下:

new

public

intwidth

set }

總結

1.在定義屬性時,應注意是否該屬性已經存在於基類,如果存在,就需要判斷是需要重寫該屬性,還是隱藏該屬性。

2.遞迴的呼叫一定要謹慎,否則可能造成溢位,導致崩潰。 

菜鳥d希望這篇文章對您有所幫助。

標籤: 

無法建立新的堆疊防護頁面, 

遞迴溢位, 

堆疊異常

問題解決 無法載入MYSQL擴充套件,請檢查PHP配置

phpmyadmin 無法載入 mysql 擴充套件,請檢查 php配置 的解決方法 在配置了php的執行環境,並且安裝了mysql資料庫之後,下面就可以學習下php如何與mysql進行互動了。既然mysql是資料庫,則必不可少的需要建立資料庫 表 欄位等操作 假象下我們使用asp access的情...

無法掛載cdrom的問題解決

一直停留在gcc應用程式設計,今天進入板子實踐,需要進入光碟機安裝,mount mnt cdrom 命令提示 mount can t find mnt cdrom in etc fstable or etc mtab google下,發現有類似的問題,解決方案如下,不過它不適合我,這裡貼過來供需要的...

mysq無法輸入中文的問題解決

二.永久解決辦法 第一次遇到docker安裝mysql 連線後死活無法輸入中文,下面是解決辦法 root 9b8431717d87 locale a cc.utf 8 posix root 9b8431717d87 exit 容器系統內預設使用的是posix字符集,而posix字符集是不支援中文的 ...