Vulkan issue with repeated initialization

The nvidia vulkan library doesn’t cleanly restart. Here is a test:

#include <vulkan/vulkan.h>
#include <stdio.h>

// gcc toy.c -lvulkan && valgrind ./a.out
//
// uname:
//  6.12.48+deb13-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.48-1 (2025-09-20) x86_64 GNU/Linux
// nvidia-smi:
//  NVIDIA-SMI 550.163.01             Driver Version: 550.163.01     CUDA Version: 12.4
//  ... NVIDIA GeForce RTX 4070 

int main(void)
{
  uint32_t original_num_phdevs = 0;
  for (size_t i = 0; i < 1000; ++i) {
    VkInstance inst;
    VkApplicationInfo app_info = {
      .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
      .pNext = NULL,
      .pApplicationName = "leak_test",
      .applicationVersion = VK_MAKE_VERSION(0, 0, 1),
      .pEngineName = "leak_test",
      .engineVersion = VK_MAKE_VERSION(0, 0, 1),
      .apiVersion = VK_API_VERSION_1_4,
    };

    VkInstanceCreateInfo create_info = {};
    create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
    create_info.pNext = NULL;
    create_info.pApplicationInfo = &app_info;
    create_info.enabledExtensionCount = 0;
    create_info.ppEnabledExtensionNames = NULL;
    create_info.enabledLayerCount = 0;
    create_info.ppEnabledLayerNames = NULL;

    if (vkCreateInstance(&create_info, NULL, &inst) != VK_SUCCESS) {
      printf("failed to create Vulkan instance\n");
      return -1;
    }

    uint32_t num_phdevs;
    if (vkEnumeratePhysicalDevices(inst, &num_phdevs, 0) != VK_SUCCESS) {
      printf("failed to enumerate Vulkan instance\n");
      return -1;
    }
    if (i == 0) {
      original_num_phdevs = num_phdevs;
    }

    vkDestroyInstance(inst, NULL);
    if (original_num_phdevs != num_phdevs) {
      printf("Num phdevs mismatch at restart: %d %d %d\n", i, num_phdevs, original_num_phdevs);
      return -1;
    }
  }

  return 0;
}

for me the output is:

Num phdevs mismatch at restart: 9 2 3

(I have an integrated AMD and a CPU-llvm device, both keep showing up).

Also lots of valgrind issues for valgrind –leak-check=full ./a.out:

==27033== 
==27033== HEAP SUMMARY:
==27033==     in use at exit: 318,798 bytes in 2,756 blocks
==27033==   total heap usage: 209,758 allocs, 207,002 frees, 12,365,515,310 bytes allocated
==27033== 
==27033== 368 (40 direct, 328 indirect) bytes in 1 blocks are definitely lost in loss record 2,529 of 2,558
==27033==    at 0x484BBA3: calloc (vg_replace_malloc.c:1675)
==27033==    by 0xD1AD49D: ???
==27033==    by 0xD1AD576: ???
==27033==    by 0xD1A05F4: ???
==27033==    by 0x4860404: ???
==27033==    by 0x68CF63D: ???
==27033==    by 0x68CE5EC: ???
==27033==    by 0x68CF331: ???
==27033==    by 0x48A755D: ??? (in /usr/lib/x86_64-linux-gnu/libvulkan.so.1.4.309)
==27033==    by 0x48ABDA2: ??? (in /usr/lib/x86_64-linux-gnu/libvulkan.so.1.4.309)
==27033==    by 0x48B70E3: vkCreateInstance (in /usr/lib/x86_64-linux-gnu/libvulkan.so.1.4.309)
==27033==    by 0x109247: main (in /tmp/silly_vulkan/a.out)
==27033== 
==27033== 368 (40 direct, 328 indirect) bytes in 1 blocks are definitely lost in loss record 2,530 of 2,558
==27033==    at 0x484BBA3: calloc (vg_replace_malloc.c:1675)
==27033==    by 0xC1AD49D: ???
==27033==    by 0xC1AD576: ???
==27033==    by 0xC1A05F4: ???
==27033==    by 0x4860404: ???
==27033==    by 0x68CF63D: ???
==27033==    by 0x68CE5EC: ???
==27033==    by 0x68CF331: ???
==27033==    by 0x48A755D: ??? (in /usr/lib/x86_64-linux-gnu/libvulkan.so.1.4.309)
==27033==    by 0x48ABDA2: ??? (in /usr/lib/x86_64-linux-gnu/libvulkan.so.1.4.309)
==27033==    by 0x48B70E3: vkCreateInstance (in /usr/lib/x86_64-linux-gnu/libvulkan.so.1.4.309)
==27033==    by 0x109247: main (in /tmp/silly_vulkan/a.out)
==27033== 
==27033== 368 (40 direct, 328 indirect) bytes in 1 blocks are definitely lost in loss record 2,531 of 2,558
==27033==    at 0x484BBA3: calloc (vg_replace_malloc.c:1675)
==27033==    by 0xC8F449D: ???
==27033==    by 0xC8F4576: ???
==27033==    by 0xC8E75F4: ???
==27033==    by 0x4860404: ???
==27033==    by 0x68CF63D: ???
==27033==    by 0x68CE5EC: ???
==27033==    by 0x68CF331: ???
==27033==    by 0x48A755D: ??? (in /usr/lib/x86_64-linux-gnu/libvulkan.so.1.4.309)
==27033==    by 0x48ABDA2: ??? (in /usr/lib/x86_64-linux-gnu/libvulkan.so.1.4.309)
==27033==    by 0x48B70E3: vkCreateInstance (in /usr/lib/x86_64-linux-gnu/libvulkan.so.1.4.309)
==27033==    by 0x109247: main (in /tmp/silly_vulkan/a.out)
==27033== 
==27033== 512 bytes in 1 blocks are possibly lost in loss record 2,532 of 2,558
==27033==    at 0x4844818: malloc (vg_replace_malloc.c:446)
==27033==    by 0x40113A8: malloc (rtld-malloc.h:56)
==27033==    by 0x40113A8: _dl_resize_dtv (dl-tls.c:559)
==27033==    by 0x4011C76: _dl_update_slotinfo (dl-tls.c:880)
==27033==    by 0x400C946: update_tls_slotinfo (dl-open.c:409)
==27033==    by 0x400C946: dl_open_worker_begin (dl-open.c:729)
==27033==    by 0x4002398: _dl_catch_exception (dl-catch.c:241)
==27033==    by 0x400B9A7: dl_open_worker (dl-open.c:761)
==27033==    by 0x4002398: _dl_catch_exception (dl-catch.c:241)
==27033==    by 0x400BDA7: _dl_open (dl-open.c:874)
==27033==    by 0x498A257: dlopen_doit (dlopen.c:56)
==27033==    by 0x4002398: _dl_catch_exception (dl-catch.c:241)
==27033==    by 0x40024BE: _dl_catch_error (dl-catch.c:260)
==27033==    by 0x4989D66: _dlerror_run (dlerror.c:138)
==27033== 
==27033== 1,201 (184 direct, 1,017 indirect) bytes in 1 blocks are definitely lost in loss record 2,542 of 2,558
==27033==    at 0x484BBA3: calloc (vg_replace_malloc.c:1675)
==27033==    by 0xD5159DF: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD51AE3A: _dbus_message_loader_queue_messages (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD52514F: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD525291: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD523482: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD523C8E: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD525010: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD50AB0C: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD50B47F: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD50BAE5: dbus_connection_send_with_reply_and_block (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD507797: dbus_bus_register (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033== 
==27033== 1,201 (184 direct, 1,017 indirect) bytes in 1 blocks are definitely lost in loss record 2,543 of 2,558
==27033==    at 0x484BBA3: calloc (vg_replace_malloc.c:1675)
==27033==    by 0xD5159DF: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD51AE3A: _dbus_message_loader_queue_messages (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD52514F: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD525291: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD523482: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD523C8E: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD525010: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD50AB0C: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD50B47F: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD50BAE5: dbus_connection_send_with_reply_and_block (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xEDB8090: ???
==27033== 
==27033== 1,201 (184 direct, 1,017 indirect) bytes in 1 blocks are definitely lost in loss record 2,544 of 2,558
==27033==    at 0x484BBA3: calloc (vg_replace_malloc.c:1675)
==27033==    by 0xD5159DF: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD51AE3A: _dbus_message_loader_queue_messages (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD52514F: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD525291: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD523482: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD523C8E: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD525010: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD50AB0C: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD50B47F: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD50BAE5: dbus_connection_send_with_reply_and_block (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xF9B8090: ???
==27033== 
==27033== 1,840 (200 direct, 1,640 indirect) bytes in 5 blocks are definitely lost in loss record 2,547 of 2,558
==27033==    at 0x484BBA3: calloc (vg_replace_malloc.c:1675)
==27033==    by 0xD1BB49D: ???
==27033==    by 0xD1BB576: ???
==27033==    by 0xD1AE5F4: ???
==27033==    by 0x4860404: ???
==27033==    by 0x68CF63D: ???
==27033==    by 0x68CE5EC: ???
==27033==    by 0x68CF331: ???
==27033==    by 0x48A755D: ??? (in /usr/lib/x86_64-linux-gnu/libvulkan.so.1.4.309)
==27033==    by 0x48ABDA2: ??? (in /usr/lib/x86_64-linux-gnu/libvulkan.so.1.4.309)
==27033==    by 0x48B70E3: vkCreateInstance (in /usr/lib/x86_64-linux-gnu/libvulkan.so.1.4.309)
==27033==    by 0x109247: main (in /tmp/silly_vulkan/a.out)
==27033== 
==27033== 2,402 (368 direct, 2,034 indirect) bytes in 2 blocks are definitely lost in loss record 2,550 of 2,558
==27033==    at 0x484BBA3: calloc (vg_replace_malloc.c:1675)
==27033==    by 0xD5159DF: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD51AE3A: _dbus_message_loader_queue_messages (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD52514F: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD525291: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD523482: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD523C8E: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD525010: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD50AB0C: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD50B47F: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD50BAE5: dbus_connection_send_with_reply_and_block (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xF1B8090: ???
==27033== 
==27033== 3,603 (552 direct, 3,051 indirect) bytes in 3 blocks are definitely lost in loss record 2,551 of 2,558
==27033==    at 0x484BBA3: calloc (vg_replace_malloc.c:1675)
==27033==    by 0xD5159DF: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD51AE3A: _dbus_message_loader_queue_messages (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD52514F: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD525291: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD523482: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD523C8E: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD525010: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD50AB0C: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD50B47F: ??? (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xD50BAE5: dbus_connection_send_with_reply_and_block (in /usr/lib/x86_64-linux-gnu/libdbus-1.so.3.38.3)
==27033==    by 0xF5B8090: ???
==27033== 
==27033== LEAK SUMMARY:
==27033==    definitely lost: 1,792 bytes in 16 blocks
==27033==    indirectly lost: 10,760 bytes in 40 blocks
==27033==      possibly lost: 512 bytes in 1 blocks
==27033==    still reachable: 305,702 bytes in 2,698 blocks
==27033==         suppressed: 32 bytes in 1 blocks
==27033== Reachable blocks (those to which a pointer was found) are not shown.
==27033== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==27033== 
==27033== For lists of detected and suppressed errors, rerun with: -s
==27033== ERROR SUMMARY: 46 errors from 22 contexts (suppressed: 0 from 0)

I’m running this clean (on a machine with no window manager or other running graphics processes. Just from the tty of the machine).