It's OK to have multiple copies of a CRT if you are not doing certain things ...:
Each CRT copy will manage its own heap.
This can cause unforeseen problems if you select an object with a heap in module A using "new" and then pass it to module B, where you are trying to free it using "delete". The CRT for module B will try to identify the pointer in terms of its own heap and that where undefined behavior occurs: if you are lucky, the CRT in module B will detect a problem and you will get a heap error. If you're unlucky, something strange will happen and you won't notice it until much later ...
You will also have serious problems if you pass other CRT-driven things, such as files between modules.
If all your modules dynamically reference CRT, then all of them will share the same heap, and you can go around everything and not worry about where they are deleted.
If you statically bind a CRT in each module, then you need to make sure that your interfaces do not include these types, and that you do not allocate using the "new" or malloc in one module, and then try to clean it in another.
You can get around this limitation by using an OS allocation function such as MS Windows GlobalAlloc () / GlobalFree (), but this can be a pain as you need to keep track of which distribution scheme you used for each pointer.
If you need to worry about whether there is a CRT DLL on the target machine that your modules require or pack it with your application, this can be a pain, but it is a one-time pain - and once you donβt need to worry about everything, what was said above.
source share