欢迎进入C/C++编程社区论坛,与300万技术人员互动交流 >>进入 a. 简介 b. 设计期间的 avs a. 硬件原因 b. 软件原因 c. 库的错误 d. 升级 c++builder c. 运行期间的 avs a. 程序退出时发生 avs b. 将你的指针设为空指针 ! c. 使用 ide管理! d. 在 form中使用c
欢迎进入C/C++编程社区论坛,与300万技术人员互动交流 >>进入
a. 简介
b. 设计期间的 avs
a. 硬件原因
b. 软件原因
c. 库的错误
d. 升级 c++builder
c. 运行期间的 avs
a. 程序退出时发生 avs
b. 将你的指针设为空指针 !
c. 使用 ide管理!
d. 在 form中使用cafree!
e. 随机 avs(非退出)
d. 用户提出的更多建议
简介
访问冲突( avs )是 windows 编程时发生的最麻烦的错误之一。尽管很难用一篇文章来解释清楚所有可能导致 avs 的原因,我将尽可能的解释所有我所知道的原因。若您有本文中未提及的 avs 的解决办法,请 email 给作者。您的经验将加到本文中。
c++builder 中发生的 avs 主要有两种形式。设计期间的 avs 和运行期间的 avs 。我们开始讨论吧。
设计期间的 avs
设计期间的 avs 最容易捕捉到,但靠您自己很难真正除掉它。它们通常产生于编译时、 builder 启动和关闭时,或者几乎是随机的。让我们先讨论以下这些已知的原因。
硬件原因
某些显卡、双处理器主板、和声音设备会导致 c++buider 中的 avs 。为什么?您机器中的每一块板卡都带有设备驱动。由于制造商、 windows 版本、你使用的 c++builder 版本的不同而存在兼容问题,会导致 avs 问题。解决这种情况的步骤如下:
o 总是使用您系统部件的最新驱动程序。若您使用随 windows 所带的驱动程序的话,你应从制造商那儿获取最新的升级版本。
o 访问 borland.com 和 dejanews.com 上的新闻组,查找关于您的硬件设备的主题。某些显卡已知有兼容问题。您可能需要更换硬件。使用人所共知的稳定且成熟的厂商提供的硬件是个好主意。 matrox 就是个显卡的好例子。
o 检查您所安装的设备之间有没有冲突是个必须的步骤。
o 对一些古怪的显卡驱动程序来说 , 有时调低分辨率有助于稳定。
o 若您使用双处理器的话,确保两个处理器的 step revision 相同,就是要用完全一样的两个芯片啦。
软件原因
尽管 windows 是 intel 体系中使用最广泛的操作系统,但它的历史是充满 bug 、不稳定的。有许多方法能帮您拥有一个更稳定的编程工作站。按以下步骤将帮你预防此类 avs 的发生。
o 禁用装有 internet explorer (ie) 4.x 或更高版本的 windows 工作站上的 active desktop 。尽管这个功能可以让您定制自己的桌面,但同时也导致许多应用程序产生问题。
o 尽管 windows 9x 更大众化, nt4 ( nt5 )提供了几乎是所有 windows 平台中最稳定的环境。我想强调这应是 c++builder 程序员选择的环境。
o 确保安装了最新的 nt 系统补丁( spx ),每次发布的补丁都让您的 nt 系统变得更稳定。
o 在升级了主要软件包后,重新安装最新的 spx 。包括 ms office , ie ,甚至是在 c++builder 安装后,某些 spx 更新的文件经常在安装驱动时被覆盖。如果 spx 提问是否用旧版本取代新版本时,回答否。
o 我们的经验是当你发现新装的系统,经过一段时间后开始出现越来越多的问题时(包括 avs ),重装系统可以解决绝大多数的问题,并可以提高系统的整体性能。这可能很费时,但绝对有效。
库的错误
安装了新的库和组件后,应该跟踪一下并看一看是否有对设计期间 avs 的更正。若发生了新的 avs ,你也许希望卸载最近安装的组件。如果 avs 也消失的话,寻求供应商的支持。
同时应对 readme 文件与安装简介多加注意。如果你升级了一个库,这也许需要你改变你的 include 目录设置,甚至修改你的 make 文件,来使新旧版本没有冲突。如果可能并且升级程序允许,你应该总是先卸载旧版本后再升级。
升级 c++builder
我可以保证我不为 inprise 工作,也没有得到任何利益。我无法再强调使用 c++builder 的新版本的重要意义。 avs 的数量尤其是设计期间的 avs 在我从 cb3 升级至 cb4 (现在已经是 cb5 啦)后,大大减少了。同时,性能得到提升,有更多可以使用的资源。若你要长跑的话,升级是很值得的。
运行期间的 avs
尽管跟踪是一场噩梦,运行期间的 avs 是可以解决的,它们通常不是 c++ builder 中所描述的 bugs 。在我开始帮你解决你代码中的疑难前,你必须读过并了解设计期间的 avs 讯息。本部分中的建议只对运行期间的 avs 起作用。尤其注意你的 include 目录是否包含最新升级的库,这往往是罪魁祸首。如果这些都不能解决你的问题,再让我们讨论编程方面,应该可以解决你的问题,让你回到工作中去。
程序退出时发生 avs
如果你已经见过你的程序退出时,弹出的 avs 对话框 , 那么恭喜你现在象分享了许多 c++builder 程序员一样(包括我)的挫折。这类 avs 是最难跟踪的。因为 debuger 通常会把你引入深不可测的 vcl 内部或干脆指向工程 cpp 文件的后括号。但不要害怕,下面的东西将帮你走过你的 av 经历中最坏最坏的部分。
将你的指针设为空指针 !
导致 av 的一个最大的原因是尝试删除一个非法指针。发生的原因可能使用了一个没有初始化的指针或试图将东西删除两遍。如果你遵照如下指导,可以减少 50% 的 avs 在您的程序中发生。对所有的指针,均如下操作:
1. 声明指针之后,将其设为 null 。 没有这么做的话,你不要立刻对这个指针使用 new 动作。否则当程序退出并执行删除动作的话,指针的地址将变成无意义的。然后你就得到一个 av 。
2. 删除一个指针后,将其设为 null 。 尽管 delete 动作已将内存清除,但它并没有清除指针地址。如果后来又删除一次指针的话,将导致一个 av 。
记住删除一个 null 空指针没有错,也不会带来副作用。
使用 ide 管理 !
如果你创建了一个属于( owned by )其他对象的对象,让 owner 来删除这个对象。糊涂了?请允许我举个例子解释。如果你动态创建了一个 panel 对象,并在 new 方法中将它的 owner 设为一个 form ( tpanel mypanel=new tpanel(this) )。这样当 owner ( form )被删除时,他将尝试删除你的 panel 。如果你已经删除了 … ,哇, av 。所以,任何时候当你 new 一个对象并在构造函数( constructor )中设定了它的 owner ,不要手工删除此对象,让 builder 来做。若你必须这样做,确保你将它设为 null 。
[NextPage]
在 form 中使用 cafree!
如果可以,不要手工删除动态创建的 form 实例,而在其 exit 事件中使用 cafree. 尽管这样做并不一定解决你的访问冲突( avs )问题,但你可以分离出此原因。因为 av 将发生在事件中而不是在程序退出时。
随机 avs( 非退出 )
创建一个程序问题列表不仅要花很多时间,而且你所碰见的问题我很可能没有包含在内。但这里仍有很小一部分最常见的 av 代码问题:
o 尝试访问字符串长度以外的位置。例如:字符串是 null 空的 (\"\") ,并且试图访问串的第一个字符 mystr[1] 。
o 引用一个空指针。可能的原因有:指针应该 new 却没有 new 、指针在被访问之前就已删除、局部和全局指针同名,全局或局部指针一个 new 过,但另一个被访问了。
用户提出的更多建议
防止访问空指针问题的一个办法是在决定使用指针做任何事之前总是先检查所有的指针。可以有许多方法来实现。最好的办法恐怕是使用 assert ,其实 if(myptr!=null) {...} 的形式也不错。值得指出的是对多层指针( multi-level ), if 方法同样可以很好的工作。这要感谢 c 语言坚决支持在“ if ”谓词的第一个假值处就跳转(布尔赋值短路)。如: if(myptr!=null && myptr->itsptr!=null && myptr->itsptr->ptr2!=null) {....}
在下面的例子中 int *parray = new int[2]; parray[0] = 1; parray[1] = 2; parray[2] = 2; 溢出!! 数组只申请了8 bytes... 并没有弹出通常情况下的av对话框(带红x的那个)。而是弹出了一个不带图标的对话框,同时也弹出了cpu窗口。所以,当你看到类似的情况,就可以知道有数组溢出….

MySQL和SQLite的主要區別在於設計理念和使用場景:1.MySQL適用於大型應用和企業級解決方案,支持高性能和高並發;2.SQLite適合移動應用和桌面軟件,輕量級且易於嵌入。

MySQL中的索引是數據庫表中一列或多列的有序結構,用於加速數據檢索。 1)索引通過減少掃描數據量提升查詢速度。 2)B-Tree索引利用平衡樹結構,適合範圍查詢和排序。 3)創建索引使用CREATEINDEX語句,如CREATEINDEXidx_customer_idONorders(customer_id)。 4)複合索引可優化多列查詢,如CREATEINDEXidx_customer_orderONorders(customer_id,order_date)。 5)使用EXPLAIN分析查詢計劃,避

在MySQL中使用事務可以確保數據一致性。 1)通過STARTTRANSACTION開始事務,執行SQL操作後用COMMIT提交或ROLLBACK回滾。 2)使用SAVEPOINT可以設置保存點,允許部分回滾。 3)性能優化建議包括縮短事務時間、避免大規模查詢和合理使用隔離級別。

選擇PostgreSQL而非MySQL的場景包括:1)需要復雜查詢和高級SQL功能,2)要求嚴格的數據完整性和ACID遵從性,3)需要高級空間功能,4)處理大數據集時需要高性能。 PostgreSQL在這些方面表現出色,適合需要復雜數據處理和高數據完整性的項目。

MySQL數據庫的安全可以通過以下措施實現:1.用戶權限管理:通過CREATEUSER和GRANT命令嚴格控制訪問權限。 2.加密傳輸:配置SSL/TLS確保數據傳輸安全。 3.數據庫備份和恢復:使用mysqldump或mysqlpump定期備份數據。 4.高級安全策略:使用防火牆限制訪問,並啟用審計日誌記錄操作。 5.性能優化與最佳實踐:通過索引和查詢優化以及定期維護兼顧安全和性能。

如何有效監控MySQL性能?使用mysqladmin、SHOWGLOBALSTATUS、PerconaMonitoringandManagement(PMM)和MySQLEnterpriseMonitor等工具。 1.使用mysqladmin查看連接數。 2.用SHOWGLOBALSTATUS查看查詢數。 3.PMM提供詳細性能數據和圖形化界面。 4.MySQLEnterpriseMonitor提供豐富的監控功能和報警機制。

MySQL和SQLServer的区别在于:1)MySQL是开源的,适用于Web和嵌入式系统,2)SQLServer是微软的商业产品,适用于企业级应用。两者在存储引擎、性能优化和应用场景上有显著差异,选择时需考虑项目规模和未来扩展性。

在需要高可用性、高級安全性和良好集成性的企業級應用場景下,應選擇SQLServer而不是MySQL。 1)SQLServer提供企業級功能,如高可用性和高級安全性。 2)它與微軟生態系統如VisualStudio和PowerBI緊密集成。 3)SQLServer在性能優化方面表現出色,支持內存優化表和列存儲索引。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。