emscripten-core / emscripten-core/emscripten

val::array doesn't take ownership of std::vector items

Open
#16,424 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
27.6k
Forks
3.6k
Avg merge
1d 1h
Merged PRs (30d)
105

Description

I think there is a bug in how `val` takes or does not take ownership of the passed in C++ value. Consider main.cpp:

```
#include
#include

using namespace emscripten;

struct Foo {
~Foo() {
std::cout << "Destruct!" << std::endl;
}
};

val getFoos() {
std::vector> vec { std::make_shared() };
return val::array (vec);
}

val getFoos2() {
std::vector> vec { std::make_shared() };
std::vector valVec (vec.begin(), vec.end());
return val::array (vec);
}

EMSCRIPTEN_BINDINGS(Foo) {
class_("Foo")
.smart_ptr>("Foo");

function("getFoos", getFoos);
function("getFoos2", getFoos2);
}
```

and main.js:
```
console.log("getFoos");
Module.getFoos ();
console.log("getFoos2");
Module.getFoos2 ();
```
This prints
```
getFoos
Destruct!
getFoos2
```

In my understanding it shouldn't print Destruct! at all.

**Version of emscripten/emsdk:**
```
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 3.1.5 (d33328b22db1aa62a51c50731e9645951a2038bc)
clang version 15.0.0 (https://github.com/llvm/llvm-project f3bc7fd5465a3a919388b6a0307553ef4a6d39c9)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: /Volumes/SSD/git/emsdk/upstream/bin
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.