小编Tho*_*mas的帖子

来自JNI_CreateJavaVM(jvm.dll)的异常0xC0000005

我正在使用以下C++代码初始化Java VM.JNI_CreateJavaVM抛出一个0xC0000005异常,但如果忽略它就会成功.

'Jni.exe'(Win32):加载'C:\ Tools\Java\Jdk8.77x86\jre\bin\zip.dll'.无法找到或打开PDB文件.

Jni.exe中0x02900282处抛出异常:0xC0000005:访问冲突读取位置0x00000000.

'Jni.exe'(Win32):加载'C:\ Windows\SysWOW64\shell32.dll'.无法找到或打开PDB文件.

我忘了设置或做某事还是这种"正常"行为?

#include <array>
#include "jni.h"

int main( int argc, char const* args[])
{
    JavaVM* jvm;
    JNIEnv* env;

    std::array<JavaVMOption,1> options;
    options[0].optionString = "-Djava.class.path=C:/Users/Thomas/Documents/Visual Studio 2015/Projects/Jni/x64/Debug";
    options[0].extraInfo = nullptr;

    JavaVMInitArgs vm_args;
    vm_args.version = JNI_VERSION_1_8;
    vm_args.options = options.data();
    vm_args.nOptions = options.size();
    vm_args.ignoreUnrecognized = false;

    auto rc = JNI_CreateJavaVM( &jvm, reinterpret_cast<void**>(&env), &vm_args );
    if( rc == JNI_OK )
    {
        jvm->DestroyJavaVM();        
    }
}
Run Code Online (Sandbox Code Playgroud)

发布和调试以及x86和x64版本都会发生这种情况.

java java-native-interface jvm visual-studio-2015

10
推荐指数
2
解决办法
3375
查看次数

HippoMocks - 模拟返回unique_ptr的函数

我目前没有成功模拟返回unique_ptr的接口.例如,给定

struct IFoo {     
    virtual std::unique_ptr<IFoo> foo = 0;
};


int main()
{
    MockRepository mocks;
    auto foo = mocks.Mock<IFoo>();
    mocks.OnCall( foo, IFoo::foo )
         .Return( std::unique_ptr<IFoo>() );
}
Run Code Online (Sandbox Code Playgroud)

这无法编译,因为该Return实现创建了unique_ptr的副本

Call &Return(Y obj) { retVal = new ReturnValueWrapper<Y>(obj); return *this; }
Run Code Online (Sandbox Code Playgroud)

并期望尝试返回unique_ptr

template <typename Z>
Z MockRepository::DoExpectation(base_mock *mock, std::pair<int, int> funcno, const base_tuple &tuple)
{
    ...
    return ((ReturnValueWrapper<Z> *)call->retVal)->rv;
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试过Do,就像返回引用的类似问题所建议那样.

我也尝试编写自己的ValueWrapper<T>,生成一个unique_ptr,但在某处,值总是被复制.现在我已经没想完了.

c++ mocking c++11 hippomocks

6
推荐指数
1
解决办法
1294
查看次数

为什么 boost::circular_buffer 在我的基准测试中这么慢?

阅读基本原理, boost::circular_buffer 看起来很有希望:

适用于实时和性能关键应用程序。

从正面和背面快速恒定时间插入和移除元素。

当我运行一个简单的基准测试来模拟我的用例时,将其用作字节缓冲区:

  1. 写一个更大的块
  2. 读取较小的块直到为空
  3. 重复

性能绝对糟糕透顶,比我自己的 hack 和 spsc_queue 慢 4000 多倍。

lin : 101  // 10240x
lock: 109  // 10240x
circ: 427  // 10x
Run Code Online (Sandbox Code Playgroud)

注意,对于loopcountcircular10和loopcount为别人10*1024。请参阅此处的工作示例。

我使用它是完全错误的还是它只是没有考虑基本/ POD 类型?

编辑:

采用具有所提供更改的基准并不能完全解决 MSVC2015 上的问题。仍然有 100 倍的系数。

lin : 69   // 10240x
lock: 79   // 10240x
circ: 9688 // 10240x 
Run Code Online (Sandbox Code Playgroud)

一次插入多个项目如此缓慢是有问题的。分配在这种特殊情况下会起作用,因为在插入之前缓冲区已耗尽,但这不是通用解决方案。在resume spsc_queue各方面都胜出,它的速度快,可以不消耗,可以用在多线程环境中(单生产者单消费者场景)。

c++ boost

5
推荐指数
1
解决办法
1006
查看次数

是否可以在 new 执行期间在构造函数中传递不同的参数?

假设我有一个带有构造函数的类:

Class MyClass {
  public:
     MyClass(int arg);
  private:
     int a;
};
Run Code Online (Sandbox Code Playgroud)

和一个全局数组:

int MyArray[]={1,2,3,4,5,6,7,8,9,10}
Run Code Online (Sandbox Code Playgroud)

我想要一个指向 MyClass 的动态指针数组,但数组的每个元素必须调用具有不同编号的构造函数。我试图做类似的事情,但没有成功

int main()
{
   int i=0;
   MyClass *MyDynArray = new MyClass[10]{MyArray[i++]};
}
Run Code Online (Sandbox Code Playgroud)

是否可以在不使用向量的情况下在 C++ 中做到这一点?提前致谢!!

c++ constructor new-operator

2
推荐指数
1
解决办法
46
查看次数