Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类别与唯一性\u ptr<;MyClass>;导致Vulkan错误 我一直在为Vulkan开发C++类库。我遇到了在同一个类中使用class vsunique_ptr的问题。我一直在使用Visual Studio 2015 Update 3进行这项工作_C++_Unique Ptr_Vulkan - Fatal编程技术网

类别与唯一性\u ptr<;MyClass>;导致Vulkan错误 我一直在为Vulkan开发C++类库。我遇到了在同一个类中使用class vsunique_ptr的问题。我一直在使用Visual Studio 2015 Update 3进行这项工作

类别与唯一性\u ptr<;MyClass>;导致Vulkan错误 我一直在为Vulkan开发C++类库。我遇到了在同一个类中使用class vsunique_ptr的问题。我一直在使用Visual Studio 2015 Update 3进行这项工作,c++,unique-ptr,vulkan,C++,Unique Ptr,Vulkan,我将从几个类的代码开始,然后展示如何使用它们来说明问题。首先是队列类: class Queue { public: inline Queue() : Queue(VK_NULL_HANDLE) {} inline explicit Queue(const VkQueue queue) : m_queue(queue) {} inline Queue(const Queue& queue) = default; inline Queue& opera

我将从几个类的代码开始,然后展示如何使用它们来说明问题。首先是
队列
类:

class Queue
{
public:
    inline Queue() : Queue(VK_NULL_HANDLE) {}
    inline explicit Queue(const VkQueue queue) : m_queue(queue) {}
    inline Queue(const Queue& queue) = default;
    inline Queue& operator=(const Queue& queue) = default;
    inline Queue(Queue&&) = default;
    inline Queue& operator=(Queue&&) = default;
    inline ~Queue() = default;
    inline VkQueue getHandle() const noexcept { return m_queue; }

private:
    VkQueue m_queue;
};
现在,从我的
LogicalDevice
类中获取代码,该类返回
队列
唯一的ptr

在图纸代码中:

VkQueue queue = m_graphicsQ.getHandle();
result = vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE);
m_graphicsQ = m_logicalDevice->getQueue(indices.graphicsFamily, 0);
m_graphicsQueue = m_logicalDevice->getQueuePtr(indices.graphicsFamily, 0);



VkQueue queue2 = m_graphicsQueue->getHandle();
VkQueue queue = m_graphicsQ.getHandle();
assert(queue == queue2);
result = vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE);
此代码有效(结果是
VK\u成功
)。现在,如果我尝试使用
unique\u ptr
来代替
Queue

m_graphicsQueue = m_logicalDevice->getQueuePtr(indices.graphicsFamily, 0);

结果是
VK\u错误\u设备丢失

在尝试调试时,我使用了以下代码:

VkQueue queue = m_graphicsQ.getHandle();
result = vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE);
m_graphicsQ = m_logicalDevice->getQueue(indices.graphicsFamily, 0);
m_graphicsQueue = m_logicalDevice->getQueuePtr(indices.graphicsFamily, 0);



VkQueue queue2 = m_graphicsQueue->getHandle();
VkQueue queue = m_graphicsQ.getHandle();
assert(queue == queue2);
result = vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE);
queue
queue2
与预期相同,但此代码再次给出
结果
=
VK\u ERROR\u DEVICE\u LOST
。我是先设置
queue
还是
queue2
并不重要。如果我删除该行:

VkQueue queue2 = m_graphicsQueue->getHandle();

(当然还有断言),然后
result==VK\u SUCCESS
。因此,问题在于从
unique\u ptr
中检索
VkQueue
值。为什么使用
unique\u ptr
会导致此问题?

一旦打开验证并清除所有报告的错误,程序就正常工作了。有趣的是,Vulkan验证问题完全表现为其他问题。

“为什么我的代码不起作用?”与StackOverflow无关。为什么首先是类?它真正做的只是提供一个正常的默认初始化。也没有必要用指针来保持队列。@Krythic本身不是这样的。期望的行为似乎存在(虽然是隐式的)-工作
VkQueue
wrapper。演示代码也在那里。@JimOrcheson等等,那么断言是真的吗?那对Vulkan来说应该没什么区别。你启用了验证层吗?@JimOrcheson好吧,说到Vulkan,在验证错误明确之前讨论任何事情都没有意义;;访问冲突通常不是使用空对象或已删除的对象;;也许可以结束这个问题——在你解决了上述世俗的错误之前,在目前的状态下,它似乎不是特别可以回答的;;这并不特别有趣。这就是“未定义的行为”的含义。以及为什么需要验证层。实际上很幸运你得到了
VK\u错误\u设备\u丢失
。司机可能会假装什么也没发生,而你会在一年后发现错误。
m_graphicsQ = m_logicalDevice->getQueue(indices.graphicsFamily, 0);
m_graphicsQueue = m_logicalDevice->getQueuePtr(indices.graphicsFamily, 0);



VkQueue queue2 = m_graphicsQueue->getHandle();
VkQueue queue = m_graphicsQ.getHandle();
assert(queue == queue2);
result = vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE);
VkQueue queue2 = m_graphicsQueue->getHandle();