You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何cudaStreamCreateWithFlags会引发内存泄漏?且泄漏量恒定?

问题分析与解答

内存泄漏的原因

你代码里的核心问题是销毁CUDA流的函数名拼写错误:你写的是cudaStreamDestory,但CUDA runtime提供的正确函数是cudaStreamDestroy(末尾多了一个字母'y')。这个拼写错误会导致销毁流的逻辑完全没有执行——如果没开启严格编译检查,编译器甚至可能悄悄忽略这个未定义函数调用,每次循环创建的CUDA流资源都没有被释放,自然会被heaptrack检测为内存泄漏。

泄漏内存量恒定的原因

这是因为CUDA runtime内部维护了一个流对象缓存池。当你反复创建流时,runtime会优先复用之前已经创建但未被正确销毁的流对象,而不是每次都向系统申请新的内存。当循环次数达到一定值后,缓存池里的闲置流已经足够复用,就不会再分配新的内存,因此不管循环执行多少次,泄漏的内存总量都会保持恒定。

修复方案

把cudaStreamDestory改成正确的cudaStreamDestroy即可解决内存泄漏问题,修复后的代码如下:

for(int i = 0; i < 100; i++){
  cudaStream_t stream_default;
  cudaError_t err = cudaStreamCreateWithFlags(&stream_default, cudaStreamDefault);
  // 修正后的销毁函数
  cudaStreamDestroy(stream_default);
}

内容的提问来源于stack exchange,提问作者张子阳

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 01:17:33