我一直在尝试在我的程序中追踪访问冲突时遇到问题.它是在第三次调用析构函数时发生的,恰好是析构函数完成时.
我花了好几个小时试图追踪这一点,所以我正在寻找有关我能做的事情的进一步建议.我正在用new和delete运算符创建类实例.Visual Studio输出窗口显示:
First-chance exception at 0x60e3ad84 (msvcp100d.dll) in WebCollationAgent.exe: 0xC0000005: Access violation writing location 0xabababab.
Unhandled exception at 0x60e3ad84 (msvcp100d.dll) in WebCollationAgent.exe: 0xC0000005: Access violation writing location 0xabababab.
有什么我可以做的,试图找出那些记忆位置的内容吗?
调用堆栈窗口显示以下内容(与我按时间顺序粘贴它的顺序相反,最早到最新):
Program.exe!Network::`scalar deleting destructor'() + 0x2b bytes C++
Program.exe!std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::~basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >() Line 754 + 0xf bytes C++
Program.exe!std::_String_val<wchar_t,std::allocator<wchar_t> >::~_String_val<wchar_t,std::allocator<wchar_t> >() Line 478 + 0xb bytes C++
Run Code Online (Sandbox Code Playgroud)
msvcp100d.dll!std :: _ Container_base12 :: _ Orphan_all()第214行+ 0x5字节C++
我对这些信息的最佳猜测是,有某种字符串变量引起了这个问题?有没有人对解释这些信息有任何建议?
任何其他建议也会有用,提前谢谢.
我在Windows 7下编码并使用Visual Studio 2010 Professional.
似乎最近已在Entity Framework Core中添加了支持,.NET Core 2.1 (preview)以允许SQL_VARIANT列的映射(https://github.com/aspnet/EntityFrameworkCore/issues/7043)。
看来要执行此操作的HasConversion()方法是使用新方法(https://docs.microsoft.com/en-us/ef/core/modeling/value-conversions)。
因此,为了映射我的SQL_VARIANT列并将基础数据类型视为VARCHAR任意长度的a(我现在只在乎读取它),我可以执行以下操作(此处的Value属性是object模型中的类型):
entity.Property(e => e.Value).HasConversion(v => v.ToString(),
v => v.ToString());
Run Code Online (Sandbox Code Playgroud)
如果SQL_VARIANT的基础数据类型为VARCHAR任意长度,则此方法有效。
但是,作为a SQL_VARIANT,列可以包含其他类型的数据,例如DATETIME值。
为简单起见,我只规定DateTime和string这里,但在理论上我可能要支持任何可以被存储在一个必要的映射数据类型SQL_VARIANT,如果可能的列。
如何确定在运行时要映射到的两种类型(string和DateTime)中的哪一种?有没有办法做到这一点?
我试图运行一个应用程序(我没有改变代码一段时间,因为它正常工作)链接到我的DLL时遇到一个奇怪的错误.这个DLL曾经工作,但我一直在修改DLL的代码,并让它编译好.不幸的是,在尝试运行应用程序时......
---------------------------
GameTest001.exe - Entry Point Not Found
---------------------------
The procedure entry point ??0Music@@QAE@ABV0@@Z could not be located in the dynamic link library Renderer02.dll.
---------------------------
OK
---------------------------
Run Code Online (Sandbox Code Playgroud)
我不知道如何解释这个错误.我知道我做了什么改变,我的代码看起来很好.我试过谷歌搜索,没有运气.
任何人都可以对此有所了解吗?这个错误是什么意思?
这样做的最终目标是拥有一个函数,该函数可以采用可变数量的某种类型(相同类型,而不是不同类型)的参数,这些参数可以在函数调用时声明。
当我使用 Visual Studio 2010 时,我不能这样做:
MyFunction({1,2,3});
Run Code Online (Sandbox Code Playgroud)
在之前回答的一个问题中,我发现我可以使用boost::assign::list_of(),但是后来我发现如果您尝试仅将一个参数传递给它,这似乎存在某种错误。
所以我做了更多的搜索,发现我可以使用可变参数函数来实现我的目标。
void TestFunction2<int>(int count, ...)
{}
Run Code Online (Sandbox Code Playgroud)
但是,我想按类型限制它,所以最终发现我可以用模板来做到这一点:
template <class T>
void TestFunction(const T& count, ...);
template <>
void TestFunction<int>(const int& count, ...);
Run Code Online (Sandbox Code Playgroud)
不幸的是, varargs 之类的东西va_list显然不喜欢引用。我看到的限制此类类型的示例使用了 const 引用。如果我删除 count 参数的 const 引用方面,它会按我的意愿工作,但我不知道这是否会导致可怕的副作用,或者这整个可变参数是否是一个坏主意首先。
所以我想我的问题是,我在上面最后一个例子中所做的是好还是坏?如果它很糟糕,那么有什么好的选择,这样我就可以调用一个带有一个或多个内嵌参数的函数,比如int参数?
请注意下面的简单示例:
Module Module1
<Flags>
Public Enum Names
None = 0
Test = 1
Test2 = 2
Test3 = 4
Test4 = 8
End Enum
Sub Main()
Dim test As Names = Names.Test Or Names.Test3
If (test And Names.Test3) = Names.Test3
Console.WriteLine("TRUE")
Else
Console.WriteLine("FALSE")
End If
End Sub
End Module
Run Code Online (Sandbox Code Playgroud)
我的问题的第一部分与这条线有关If (test And Names.Test3) = Names.Test3。
仅仅检查If test And Names.Test3该标志是否存在会更好吗?如果它的计算结果为非零值(意味着该标志存在),那么条件的结果仍然是True。
是否有充分的理由使用第一种方法进行第二种检查?(虽然我的回答是针对VB.NET,但我也想知道这是否是其他地方(例如C#,C ++等)的潜在陷阱)。
此外,关于标记删除,似乎有两种方法可以执行此操作:
test = test Xor Names.Test3 和 test = test And Not Names.Test3 …
在我的C ++项目中,我有一个Engine类和一个Object类。
我的问题在于如何Object创建实例。当前,这是通过使用类中的CreateObject(parameters)函数来完成的Engine。这增加的新实例Object到std::vector的Object实例。
我想维护此类Object在我的Engine类中的实例列表,但不需要此CreateObject(parameters)功能。我这样做的原因是,我可以创建可以继承Object但仍添加到此列表的新类。使用此列表的原因是为了使(Engine可以)我可以遍历Object已创建的每个实例。
最终这将意味着我Object用类似的实例创建实例Object newObject = Object(parameters);,但仍使Engine该类维护所有Object实例的列表,而无需Object引用的实例Engine或将其自身添加到此列表的列表(如Objectshould 的实例)不知道它所在的列表)。 能做到吗?
我遇到了一个奇怪的问题,试图进入一个从Linq查询中调用的方法(虽然我在使用Linq表达式时也遇到了问题).代码编译,它似乎工作(我得到了我期待的结果).
IEnumerable<TagBuilder> theOutcome = from r in resultSet
select GetTableDataRow(null);
Run Code Online (Sandbox Code Playgroud)
要么
IEnumerable<TagBuilder> theOutcome = resultSet.Select(r => GetTableDataRow(null));
Run Code Online (Sandbox Code Playgroud)
被调用的方法定义如下:
private static TagBuilder GetTableDataRow(IEnumerable<object> rowData)
{
TagBuilder tr = new TagBuilder("tr");
return tr;
}
Run Code Online (Sandbox Code Playgroud)
该resultSet变量IPagedList包含两个项目.
该变量theOutcome最终TagBuilder按预期保存两个实例.
但是,GetTableDataRow()即使我在有问题的Linq查询之前或之前设置断点,我也不能介入.如果我在GetTableDataRow()方法中放置一个断点,那么它也不会出现这种情况.
我完全难过了.有人可以帮忙吗?Code现在显然非常简单,但是我需要在开发它时用调试器逐步完成该方法的内容.
c++ ×4
c# ×2
class ×2
instance ×2
.net-core ×1
bitwise-and ×1
bitwise-xor ×1
c++11 ×1
destructor ×1
dll ×1
ienumerable ×1
linq ×1
list ×1
pagedlist ×1
sql-variant ×1
stdvector ×1
vb.net ×1