这是问题所在.我的应用程序调用CoCreateInstance()创建在第三方DLL中实现的COM对象.该DLL调用set_terminate()更改terminate()处理程序并在其中传递其自己的terminate()处理程序的地址.
初始terminate()处理程序地址不会被该库保存 - 它不关心并只是更改处理程序而永远不会恢复它.一旦DLL被卸载,其代码就不再在进程内存中,因此如果现在terminate()被调用,程序将运行到未定义的行为.
我想检索并存储初始terminate()处理程序的地址,以便能够恢复它.我该怎么做?
让我们假装我的程序包含一个特定的构造,C++标准声明它是未指定的行为.这基本上意味着实现必须做一些合理的事情,但不允许记录它.但是,每次编译具有未指定行为的特定构造时是否需要生成相同的行为,或者是否允许在不同的编译中产生不同的行为?
未定义的行为怎么样?让我们根据标准假装我的程序包含一个UB结构.允许实现表现出任何行为.但是,同一编译器中相同程序的编译在同一环境中具有相同设置时,此行为是否会有所不同?换句话说,如果我在文件X.cpp中的第78行取消引用空指针,并且在这种情况下驱动器的实现格式是否意味着它将在重新编译程序后执行相同的操作?
问题是......我使用相同的编译器设置在相同的环境中使用相同的编译器编译相同的程序.构造声明是未指定的行为,未定义的行为会在每次编译时产生相同的行为,还是允许它们在编译之间有所不同?
可能重复:
未定义,未指定和实现定义的行为
我正在努力加深对C++中未定义行为的理解.假设C++编译器会故意检测某些未定义行为的情况 - 例如,在两个序列点之间修改变量两次:
x++ = 2;
Run Code Online (Sandbox Code Playgroud)
一旦该虚构的编译器可靠地检测到这种情况,它就会发出十个完全随机的机器指令到生成的机器代码中.
根据C++标准,无论什么东西被归类为UB,对发生的事情都没有要求.所描述的虚构编译器是否符合C++标准?
我需要一个或多或少等同于C++的.NET 3.5类std::vector:
早些时候我用过ArrayList,它是正确的,除了它存储object,我必须将检索到的对象转换为正确的类型,我可以添加任何东西,这使编译时类型检查更难.
有没有像ArrayList包含类型参数化的东西?
这是场景.我在Visual Studio中创建一个新的类库项目,添加一些类.然后在某些时候我决定我需要一些类来标记,System.Runtime.Serialization.DataContractAttribute我写下面的内容:
[DataContract]
public class MyDataContractClass {}
Run Code Online (Sandbox Code Playgroud)
当我点击编译时,我看到以下错误:
错误CS0246:找不到类型或命名空间名称"DataMember"(您是否缺少using指令或程序集引用?)
好的,问题是我忘了添加using指令以使类可见.我加
using System.Runtime.Serialization;
Run Code Online (Sandbox Code Playgroud)
到类上面的同一个文件,但问题不会消失,直到我System.Runtime.Serialization在Project Explorer中添加引用.
这非常令人困惑.为什么我必须在不同的地方添加两次相同的东西并看到相同的错误消息,无论我错过了哪两个步骤?
我的问题如下.这只是设计错误的错误诊断,还是有一些基本原因导致错过上述两个步骤中的任何一个导致C#编译器发出的相同错误?
我想知道如何从控制器外部重定向到特定路由.我有一个自定义属性,我需要重定向路由.
public override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext)
{
// Want to redirect to route here.
base.OnAuthorization(filterContext);
}
Run Code Online (Sandbox Code Playgroud) 我在codepad.org和ideone.com上尝试了以下代码:
char* ptr = new char;
free( ptr );
Run Code Online (Sandbox Code Playgroud)
是的,我知道这是未定义的行为,但我想编译并运行它以查看会发生什么.
Visual C++ 10编译它,但在上述网站上使用的gcc说
错误:在'('标记之前)的预期构造函数,析构函数或类型转换
为什么这个代码不能用gcc编译,我怎么能让它编译?
当我在Visual C++ 10中编译以下代码时
int _tmain(int /*argc*/, _TCHAR* /*argv*/[])
{
int len = strlen( "" );
if( len / 0 ) {
rand();
}
}
Run Code Online (Sandbox Code Playgroud)
编译器发出C4723警告 电位除以零.
什么是潜在的意思吗?我的C++代码清楚地说"除以len零",分裂潜力如何?
目前,当我在Visual C++ 10中编译此代码时:
Undeclared var;
Run Code Online (Sandbox Code Playgroud)
编译器发出以下错误消息:
error C2065: 'CUndeclared' : undeclared identifier
error C2146: syntax error : missing ';' before identifier 'var'
error C2065: 'var' : undeclared identifier
Run Code Online (Sandbox Code Playgroud)
只有第一个是有用的,其余只增加输出中的噪音.现在我明白,或许产生更漂亮的错误消息并不是编译器开发的首要任务.
我想知道的是 - 是否有可能在C++中有更好的错误报告,或者C++是如此硬核,以至于编译器别无选择,只能报告三个错误?
我正在尝试将Windows Azure SDK的内容获取到我的本地磁盘.我创建了一个文件夹,cd在那里运行git init,现在每当我尝试以下任何一种情况时:
git pull WindowsAzure
Run Code Online (Sandbox Code Playgroud)
要么
git pull WindowsAzure/azure-sdk-for-net
Run Code Online (Sandbox Code Playgroud)
要么
git pull azure-sdk-for-net
Run Code Online (Sandbox Code Playgroud)
我将始终收到一条错误消息[X] does not appear to be a git repository.
我做错了什么,如何将该项目的内容提取到我的本地仓库?
c++ ×6
c# ×3
visual-c++ ×3
.net ×2
asp.net ×1
asp.net-mvc ×1
attributes ×1
azure ×1
collections ×1
gcc ×1
git ×1
github ×1
terminate ×1
using ×1