Access Violations
欢迎进入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窗口。所以,当你看到类似的情况,就可以知道有数组溢出….

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











DeepSeek은 파일을 PDF로 직접 변환 할 수 없습니다. 파일 유형에 따라 공통 문서 (Word, Excel, PowerPoint) : Microsoft Office, LibreOffice 및 기타 소프트웨어를 사용하여 PDF로 내보내십시오. 이미지 : 이미지 뷰어 또는 이미지 처리 소프트웨어를 사용하여 PDF로 저장하십시오. 웹 페이지 : 브라우저의 "PDF로 인쇄"기능 또는 전용 웹 페이지에서 PDF 도구를 사용하십시오. 드문 형식 : 오른쪽 변환기를 찾아 PDF로 변환하십시오. 올바른 도구를 선택하고 실제 상황에 따라 계획을 개발하는 것이 중요합니다.

C++에서 전략 패턴을 구현하는 단계는 다음과 같습니다. 전략 인터페이스를 정의하고 실행해야 하는 메서드를 선언합니다. 특정 전략 클래스를 생성하고 각각 인터페이스를 구현하며 다양한 알고리즘을 제공합니다. 컨텍스트 클래스를 사용하여 구체적인 전략 클래스에 대한 참조를 보유하고 이를 통해 작업을 수행합니다.

Python은 배우기 쉽고 강력한 기능을 통해 초보자에게 이상적인 프로그래밍 입문 언어입니다. 기본 사항은 다음과 같습니다. 변수: 데이터(숫자, 문자열, 목록 등)를 저장하는 데 사용됩니다. 데이터 유형: 변수의 데이터 유형(정수, 부동 소수점 등)을 정의합니다. 연산자: 수학 연산 및 비교에 사용됩니다. 제어 흐름: 코드 실행(조건문, 루프) 흐름을 제어합니다.

간단해진 Java: 강력한 프로그래밍을 위한 초보자 가이드 소개 Java는 모바일 애플리케이션에서 엔터프라이즈 수준 시스템에 이르기까지 모든 분야에서 사용되는 강력한 프로그래밍 언어입니다. 초보자의 경우 Java의 구문은 간단하고 이해하기 쉬우므로 프로그래밍 학습에 이상적인 선택입니다. 기본 구문 Java는 클래스 기반 객체 지향 프로그래밍 패러다임을 사용합니다. 클래스는 관련 데이터와 동작을 함께 구성하는 템플릿입니다. 다음은 간단한 Java 클래스 예입니다. publicclassPerson{privateStringname;privateintage;

Java는 초보자와 숙련된 개발자 모두가 배울 수 있는 인기 있는 프로그래밍 언어입니다. 이 튜토리얼은 기본 개념부터 시작하여 고급 주제를 통해 진행됩니다. Java Development Kit를 설치한 후 간단한 "Hello, World!" 프로그램을 작성하여 프로그래밍을 연습할 수 있습니다. 코드를 이해한 후 명령 프롬프트를 사용하여 프로그램을 컴파일하고 실행하면 "Hello, World!"가 콘솔에 출력됩니다. Java를 배우면 프로그래밍 여정이 시작되고, 숙달이 깊어짐에 따라 더 복잡한 애플리케이션을 만들 수 있습니다.

Python은 초보자에게 문제 해결 능력을 부여합니다. 사용자 친화적인 구문, 광범위한 라이브러리 및 변수, 조건문 및 루프 사용 효율적인 코드 개발과 같은 기능을 제공합니다. 데이터 관리에서 프로그램 흐름 제어 및 반복 작업 수행에 이르기까지 Python은 제공합니다.

C는 초보자가 시스템 프로그래밍을 배우기에 이상적인 선택입니다. 여기에는 헤더 파일, 기능 및 주요 기능이 포함되어 있습니다. "HelloWorld"를 인쇄할 수 있는 간단한 C 프로그램에는 표준 입출력 함수 선언이 포함된 헤더 파일이 필요하며 인쇄하려면 기본 함수에서 printf 함수를 사용합니다. C 프로그램은 GCC 컴파일러를 사용하여 컴파일하고 실행할 수 있습니다. 기본 사항을 마스터한 후에는 데이터 유형, 함수, 배열 및 파일 처리와 같은 주제로 이동하여 능숙한 C 프로그래머가 될 수 있습니다.

C는 초보자가 프로그래밍을 배우기에 이상적인 언어이며 효율성, 다양성 및 이식성이 장점입니다. C 언어를 배우려면 다음이 필요합니다. C 컴파일러 설치(MinGW 또는 Cygwin 등) 변수, 데이터 유형, 조건문 및 루프문 이해 주 함수와 printf() 함수가 포함된 첫 번째 프로그램 작성 실제 사례를 통한 연습(예: 평균 계산) C 언어 지식
