编辑:嗯......这很有趣.我将设置设置为指针并传递给它.工作得很漂亮.所以,这就解决了.对于那些对答案好奇的人,我会保持开放.
我在从内存流中在FMod中创建声音时遇到问题.我查看了FMod附带的loadfrommemory示例,然后进行了操作.首先,我正在使用的代码......
CSFX::CSFX(CFileData *fileData)
{
FMOD_RESULT result;
FMOD_CREATESOUNDEXINFO settings;
settings.cbsize = sizeof(FMOD_CREATESOUNDEXINFO);
settings.length = fileData->getSize();
_Sound = 0;
std::string temp = "";
for (int i = 0; i < fileData->getSize(); i++)
temp += fileData->getData()[i];
result = tempSys->createSound(temp.c_str(), FMOD_SOFTWARE | FMOD_OPENMEMORY, &settings, &_Sound);
}
Run Code Online (Sandbox Code Playgroud)
就像这样,我在tempSys-> createSound()上遇到访问冲突.我已经确认tempSys有效,因为它在从文件创建声音时起作用.我还通过将内容写入文件来确认我的数据的char*是有效的,然后我可以在Media Player中打开该文件.我觉得设置有问题.如果我将该参数更改为0,程序不会爆炸,我最终得到结果= FMOD_ERR_INVALID_HANDLE(考虑到第3个参数为0,这是有意义的).知道我做错了什么吗?
另外,请忽略std :: string的使用,我将其用于某些测试目的.
我正在阅读c ++中的CreateProcess函数,我想尝试一下.代码的基本思想是让我的主要执行另一个进程(记事本).真的,这只是基本代码.当我运行程序时,我得到:
createprocess.exe中0x752bb763处的第一次机会异常:0xC0000005:访问冲突写入位置0x00be57b8.
createprocess.exe中0x752bb763处的未处理异常:0xC0000005:访问冲突写入位置0x00be57b8.
当我为发生错误的位置设置一个断点时,我会被带到tidtable.c(我想这是用于访问线程).特别是在tidtable.c中 CRTIMP PFLS_GETVALUE_FUNCTION __cdecl __set_flsgetvalue()
我真的不知道是什么或如何避免这个问题.CreateProcess调用发生错误(即,它永远不会输出"out of create").
我的代码是:
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <strsafe.h>
#include <direct.h>
#include <string.h>
#include <conio.h>
int main(VOID)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
//allocate memory
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
fprintf(stderr, "This is just a test");
//create child process
if (!CreateProcess(NULL,
L"C:\\Windows\\Notepad.exe",
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi))
{
fprintf(stderr, "create process failed");
return -1;
}
fprintf(stderr, "out of create");
//parent waits for child to …Run Code Online (Sandbox Code Playgroud) c++ winapi createprocess unhandled-exception access-violation
我从Win7 + VS2012升级(干净安装)到Win8 + VS2012.
之后我遇到了一个问题:当我尝试使用处理器目标AnyCPU或x86运行任何项目时,vshost.exe在使用访问冲突构建和启动项目后立即崩溃.更改项目类型(console,winforms,wpf)不会影响此行为.
当我将架构更改为x64时,调试工作正常.
如果我启动一个新创建的控制台应用程序,这是我在Debug输出窗口中得到的输出:
'ConsoleApplication2.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll', Symbols loaded.
'ConsoleApplication2.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities\11.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess.Utilities.dll', Symbols loaded.
'ConsoleApplication2.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll', Symbols loaded.
'ConsoleApplication2.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll', Symbols loaded.
'ConsoleApplication2.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll', Symbols loaded.
'ConsoleApplication2.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities.Sync\11.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess.Utilities.Sync.dll', Symbols loaded.
'ConsoleApplication2.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.Debugger.Runtime\11.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.Debugger.Runtime.dll'
'ConsoleApplication2.vshost.exe' (Managed (v4.0.30319)): Loaded 'e:\Users\SeriTools\Documents\Visual Studio 2012\Projects\ConsoleApplication2\ConsoleApplication2\bin\Debug\ConsoleApplication2.vshost.exe', Symbols loaded.
'ConsoleApplication2.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll', Symbols loaded.
'ConsoleApplication2.vshost.exe' …Run Code Online (Sandbox Code Playgroud) debugging access-violation visual-studio-debugging visual-studio-2012
我的目标是使用Android MediaCodec解码视频流,然后使用输出图像在本机代码中进行进一步的图像处理.
平台:华硕tf700t android 4.1.1.测试流:H.264全高清@ 24 frm/s
有了Tegra-3 SoC,我依靠硬件支持视频解码.在功能上,我的应用程序表现得如预期的那样:我确实可以访问解码器图像并正确处理它们.但是,我遇到了非常高的解码器CPU负载.
在以下实验中,过程/线程负载由adb shell中的"top -m 32 -t"测量.为了从"top"获得可靠的输出,所有4个cpu内核都通过运行一些永久循环以最低优先级循环的线程来强制激活.这通过重复执行"cat/sys/devices/system/cpu/cpu [0-3]/online"来确认.为了简单起见,只有视频解码,没有音频; 并且没有时序控制,因此解码器尽可能快地运行.
第一个实验:运行应用程序,调用JNI处理函数,但所有进一步的处理调用都被注释掉了.结果:
似乎解码速度受CPU限制(四核CPU的25%)......启用输出处理时,解码图像正确并且应用程序正常工作.唯一的问题:解码时cpu负载过高.
经过大量的实验,我考虑给MediaCodec一个表面来绘制它的结果.在所有其他方面,代码是相同的.结果:
实际上,视频显示在提供的Surface上.由于几乎没有任何CPU负载,这必须是硬件加速......
如果提供Surface,de MediaCodec似乎只使用硬件加速?
到现在为止还挺好.我已经倾向于使用Surface作为解决方法(不是必需的,但在某些情况下甚至是一个很好的).但是,如果提供表面,我无法访问输出图像!结果是本机代码中的访问冲突.
这真让我困惑!我没有看到的访问限制任何想法,任何或文档中http://developer.android.com/reference/android/media/MediaCodec.html.此外,谷歌I/O演示文稿http://www.youtube.com/watch?v=RQws6vsoav8中也未提及此方向.
那么:如何使用硬件加速Android MediaCodec解码器并以原生代码访问图像?如何避免访问冲突?任何帮助都会被激活!也有任何解释或提示.
我敢肯定的MediaExtractor和MediaCodec正确使用,因为该应用程序是functionaly OK(只要我不提供表面).它仍然是非常实验性的,在todo列表上有一个很好的API设计;-)
请注意,两个实验之间的唯一区别是变量mSurface:null或"mDecoder.configure(mediaFormat,mSurface,null,0)中的实际Surface";
初始化代码:
mExtractor = new MediaExtractor();
mExtractor.setDataSource(mPath);
// Locate first video stream
for (int i = 0; i < mExtractor.getTrackCount(); i++) {
mediaFormat = mExtractor.getTrackFormat(i);
String mime = mediaFormat.getString(MediaFormat.KEY_MIME);
Log.i(TAG, String.format("Stream %d/%d %s", i, mExtractor.getTrackCount(), mime));
if (streamId …Run Code Online (Sandbox Code Playgroud) 我正在使用log4cplus库,我无法登录工作.
我用这个代码:
PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("log.properties"));
Logger g_logger = Logger::getInstance(LOG4CPLUS_TEXT("mylogger"));
LOG4CPLUS_WARN(g_logger, LOG4CPLUS_TEXT("test test test"));
Run Code Online (Sandbox Code Playgroud)
它打破LOG4CPLUS_WARN了错误:
Access violation reading location
这是我的调用堆栈:
msvcp110d.dll!std::basic_streambuf<wchar_t,std::char_traits<wchar_t> >::egptr() Line 236 C++
ProjectClientd.exe!std::basic_stringbuf<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::str() Line 103 C++
ProjectClientd.exe!std::basic_ostringstream<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::str() Line 553 C++
> ProjectClientd.exe!wWinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, wchar_t * lpCmdLine, int nCmdShow) Line 55 C++
ProjectClientd.exe!__tmainCRTStartup() Line 528 C
ProjectClientd.exe!wWinMainCRTStartup() Line 377 C
Run Code Online (Sandbox Code Playgroud)
在wWinMain ... line 55哪里LOG4CPLUS_WARN是被叫的地方.
我已经检查了这个有什么问题,basic_ostringstream似乎有些东西搞乱了编码或其他东西:

在我的字符串末尾没有终止字符串(不可读的内存)和一大堆奇怪的字母?可能导致什么呢?
我有一个std :: weak_ptr.在尝试使用底层对象之前,我将其锁定以获取shared_ptr:
auto foo_sharedptr = foo_weakptr.lock();
if (foo_sharedptr != nullptr)
{
// do stuff with foo
}
Run Code Online (Sandbox Code Playgroud)
通常这很好.但是,有时我在锁定调用期间遇到访问冲突:
Unhandled exception at 0x00007FF91F411BC3 (My.dll) in My.exe:
0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.
Run Code Online (Sandbox Code Playgroud)
我的猜测是底层指针已被删除,但我对weak_ptr的理解是,在这种情况下,lock应该返回一个nullptr.我在滥用这种类型吗?如果没有,我应该如何调试呢?
我正在为我维护的库组装一个Visual Studio 2013解决方案.该库主要使用竞技场分配,因此我们有一个分配器接口:
#define HAMMER_ALLOCATOR__H__
#include <sys/types.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct HAllocator_ {
void* (*alloc)(struct HAllocator_* allocator, size_t size);
void* (*realloc)(struct HAllocator_* allocator, void* ptr, size_t size);
void (*free)(struct HAllocator_* allocator, void* ptr);
} HAllocator;
[... API functions ... ]
#ifdef __cplusplus
}
#endif
#endif
Run Code Online (Sandbox Code Playgroud)
我们还实现了一个包装器malloc,realloc并且free:
#include <string.h>
#include <stdlib.h>
#include "internal.h"
void* system_alloc(HAllocator *allocator, size_t size) {
void* ptr = malloc(size + sizeof(size_t));
*(size_t*)ptr = …Run Code Online (Sandbox Code Playgroud) 当我在绑定到 UWP 中的枢轴控件的 ObservableCollection 中将项目从一个选项卡移动到另一个选项卡时,出现以下异常。
在 IRIS.ZustellerApp.exe 中的 0x699C7165 (Windows.UI.Xaml.Phone.dll) 处抛出异常:0xC0000005:访问冲突读取位置 0x00000000。
我还设法挖掘了转储,似乎异常发生在 Windows_UI_Xaml_Phone!XamlControlsTestHookCreateLoopingSelector
有趣的是,这并不尊重每次重现的相同模式。我几乎尝试了一切来解决这个问题,但没有结果。提前致谢。
我有一系列相互关联的问题。我想独立地知道所有这些问题的答案,所以*是的*,其中一些似乎是 XY 问题;但我确实想知道他们的解决方案!请参阅问题结尾以获取此集中其他问题的列表。
我有一种情况,调用Marshal.GetExceptionForHR(code, pointers)会抛出一个AccessViolationException.
显然这是一个非常糟糕的事情。太糟糕了,try...catch只是对我耸了耸肩,然后四处游荡……我不知道这是一件事:(
假设一个前提是“.GetExceptionForHR()我想做的是打电话”(请参阅其他问题以讨论这是否是一个好主意!)。
进一步假设AccessViolation在某些情况下导致 的任何原因都是不可避免的。
鉴于这些前提,有没有办法提前预测调用它们的方法会爆炸?一些等价物TryGetExceptionForHR()将返回false而不是炸毁我的整个程序。
经过3天的调查和研究,我对问题的原因已经一无所知。基本上我正在加载一个用 MinGW64 编译并链接到 C node-api 的 hello world Node JS 插件。
代码如下:
// hello.c
#include <node/node_api.h>
napi_value Method(napi_env env, napi_callback_info args)
{
napi_value greeting;
napi_status status = napi_create_string_utf8(env, "hello, asshole", NAPI_AUTO_LENGTH, &greeting);
return status == napi_ok ? greeting : (napi_value)0;
}
napi_value init(napi_env env, napi_value exports)
{
napi_value function;
napi_status status = napi_create_function(env, 0, 0, &Method, 0, &function);
if (status != napi_ok)
return (napi_value)0;
status = napi_set_named_property(env, exports, "hello", function);
return status == napi_ok ? exports : …Run Code Online (Sandbox Code Playgroud)